首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

赋值期间奇怪的Python列表行为

是指在Python中,当我们尝试将一个列表赋值给另一个变量时,可能会遇到一些奇怪的行为。这种行为涉及到列表的引用和复制。

在Python中,列表是可变对象,意味着它们可以被修改。当我们将一个列表赋值给另一个变量时,实际上是将列表的引用赋值给了新的变量。这意味着两个变量指向了同一个列表对象。因此,当我们修改其中一个变量所指向的列表时,另一个变量也会受到影响。

下面是一个示例:

代码语言:txt
复制
list1 = [1, 2, 3]
list2 = list1

list1.append(4)

print(list2)  # 输出 [1, 2, 3, 4]

在上面的示例中,我们将list1赋值给了list2。然后,我们向list1中添加了一个元素4。最后,我们打印了list2的内容,发现它也包含了新增的元素4。这是因为list1和list2指向同一个列表对象,所以它们的内容是相同的。

如果我们想要避免这种奇怪的行为,可以使用列表的复制方法来创建一个新的列表对象。有几种方法可以实现列表的复制,包括切片操作、使用list()函数和使用copy()方法。

下面是使用切片操作进行列表复制的示例:

代码语言:txt
复制
list1 = [1, 2, 3]
list2 = list1[:]

list1.append(4)

print(list2)  # 输出 [1, 2, 3]

在上面的示例中,我们使用切片操作list1[:]创建了一个新的列表对象,并将其赋值给了list2。然后,我们向list1中添加了一个元素4。最后,我们打印了list2的内容,发现它没有受到影响,仍然是原始的列表内容。

除了切片操作,我们还可以使用list()函数和copy()方法进行列表的复制。这些方法也会创建一个新的列表对象,而不是简单地复制引用。

总结起来,赋值期间奇怪的Python列表行为是由于列表的引用和复制机制导致的。为了避免这种行为,我们可以使用切片操作、list()函数或copy()方法来创建一个新的列表对象。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

delete奇怪行为

delete奇怪行为分为2部分: // 1.delete用defineProperty定义属性报错 // Uncaught TypeError: Cannot delete property 'value...但规则是这样,所以奇怪行为1是合理 占位初始值 猜测如果属性已经存在了,defineProperty()会收敛一些,考虑一下原descriptor感受: var obj = {}; obj.value...,能不能删可能只是configurable一部分) 遵循规则是:通过声明创建变量和函数带有一个不能删天赋,而通过显式或者隐式属性赋值创建变量和函数没有这个天赋 内置一些对象属性也带有不能删天赋...arr = []; delete arr.length === false void function(arg) {console.log(delete arg === false);}(1); 因为属性赋值创建变量和函数没有不能删天赋...,所以通过赋值创建变量和函数可以删,例如: x = 1; delete x === true window.a = 1 delete window.a === true 而同样会被添加到global身上全局变量声明创建东西就不能删

2.3K30

序列赋值引发Python列表陷进

序列赋值Python默认操作,如果使用不当,有可能会掉入语法陷阱。 + +是指把两个序列元素拼接在一起。...给my_list最后一个元素列表赋值,结果所有三个元素列表都被赋值了!这反映出my_list这三个元素不是3个列表,而是3个列表引用,指向了同一个相同列表。...一、赋值成功,因为t[2]指向是一个可变对象(列表[30, 40]),可变对象是能赋值。二、报错,因为可变对象赋值给了不可变对象(元组t),不可变对象不能赋值。...这位巴西作者说到,在他15年Python生涯中,他还没见过谁在这个地方吃过亏。 小结 本文分别介绍了+、*和列表列表陷阱,+=、*=和元组套列表陷阱,并分别得出了教训。...参考资料: 《流畅Python

50510
  • python列表赋值与深浅拷贝

    首先创建一个列表 a=[[1,2,3],4,5,6] 一、赋值 a=[[1,2,3],4,5,6] b=a a[0][1]='tom' print(a) print(b) 结果: [[1, 'tom',...4,5,6] b=a b[0][1]='tom' print(a) print(b) 结果: [[1, 'tom', 3], 4, 5, 6] [[1, 'tom', 3], 4, 5, 6] 总结:赋值不管是对...a列表改变还是对b列表改变, 只要改变其中一个,另一个也会跟着变,这是因为a 和b共用一块内存,没有创建新内存, 他们是相同,他们指向同一个内存区域。...[[1, 2, 3], 'tom', 5, 6]    [[1, 2, 3], 4, 5, 6] 总结:从上面代码可以看出来浅拷贝是重新开辟一块内存,拷贝第一层数据,不拷贝内部子元素 在本代码中,b列表重新开辟了一块内存放元素...【b【0】,4,5,6】,也就是第一层内容, 然后b【0】位置指向了a【0】指向内存位置 三、深拷贝   使用copy函数 重新开辟一块内存,存放拷贝列表所有内容。

    91740

    关注对象自我赋值行为

    秘籍酷 · 微店 IT编程入门指导 所谓自我赋值,指得就是一个对象赋值给自己简单行为,但这种看起来人畜无害动作,在某些情形下却可能会使得你代码崩溃。 ?...自我赋值语句,就像这样: Widget w; w = w; 很明显,这是一段愚蠢代码。...但既然我们提到自我赋值会引发问题,那我们先来澄清一下自我赋值情况其实有时并不是那么显而易见,并不一定都像上述代码那么愚蠢,它们还可能是这样: a[i] = a[j]; *px = *py; class...” 问题,假设程序在分配堆内存时,不巧发生了始料未及错误,也就是 new 语句发生了异常,此时因为 原先对象图像数据 p 已经被删除,因此这个赋值运算将会导致一个尴尬结局:新数据尚未被正常赋予,...当然,如果恰巧确实发生了 自我赋值 事件,那么代码将会白白浪费时间创建了一个原图像复制品,然后让指针指向新复制品上。

    67520

    Python列表遇上复合赋值运算符+=

    正常来讲,作用于列表时,运算符+=用法是这样: >>> x = [] >>> x += [1, 2, 3] >>> x [1, 2, 3] 列表列表相加,从效果上来看,似乎与x = x + [1,...2, 3]是一样,然而,内部区别的还是很大。...,+=属于原地操作,不会修改列表首地址,类似于列表append()方法,而... = ...+...这样写法是创新一个新对象,会修改列表首地址。...但是,我们无意中注意到上面的异常信息说整数是不可以迭代,这句话似乎有深意啊。如果我们在+=左侧是列表,而右边是可迭代对象,会是什么结果呢?...,+=右侧对象可以是任何Python可迭代对象,并且+=过程类似于循环+append(),如下面的代码: >>> x = [] >>> x += '1234' >>> x ['1', '2', '3

    1.1K30

    taskscheduler java_java – taskScheduler池奇怪行为「建议收藏」

    我有两个弹簧启动应用程序(1.4.3.RELEASE),它们位于同一台服务器上.应用程序A是一个单一应用程序,其中包含用于处理警报部分代码,而应用程序B是一个仅处理警报新专用应用程序.这里目标是打破小应用程序中...threadPoolTaskScheduler.setWaitForTasksToCompleteOnShutdown(true); threadPoolTaskScheduler.setPoolSize(100); return threadPoolTaskScheduler; } } 昨天,我经历了一个奇怪行为...已检测到警报并将其发送到新应用B – >好 >应用程序B收到警报并开始根据taskScheduler处理它 – >好 >第一步已由应用程序B处理 – >好 >第二步已由应用程序A处理 – > NOK,奇怪行为...对我来说,每个taskScheduler都附加到创建它应用程序.我哪里错了?...UPDATE 我有一个发出警报真实盒子.这些警报必须由新应用程序处理.但我还有旧盒子没有迁移到新系统.所以我在两个不同项目中有处理代码.

    1.8K10

    奇怪 Python 整数缓存机制。

    首先我们打开 Python 解释器,在里面输入如下内容: >>> a = 1024 >>> b = 1024 >>> a is b False 当 a 和 b 值皆为 1024 时候,a is b...为 False,那这里我有一个问题:当 a 和 b 值皆为 6 时候,a is b 输出结果是什么呢?...为什么待会告诉你,因为我想先讲一个更好玩东西:is。 is 叫同一运算符,它用来比较两个对象存储单元,实际比较是对象地址,来判断两个是不是引用同一个对象。...在内存中,id 这一串 xxxxx 数字其实是给了 a,is 去比较时候其实是比较这个 id 是不是同一个。...其实这就是 Python「整数缓存机制」在作怪! 在 Python 中,它会对比较小整数对象进行缓存([-5, 256]),而并非是所有的整数对象。

    1K40

    python实现将列表中各个值快速赋值给多个变量

    list1 = [1,2,3,4] a,b,c,d = list1 则 a = 1 b =2 等 这种方式只有当左边操作数个数和list1长度相同时,才可以这么做,不然报错....我们假设我们有一个list对象List,它长度足够长,想把它从下标i开始k个元素赋给k个元素,可以这么做: v1, v2, v3, …, vk = List[i : i + k] #默认i=0,...k=len(List) 补充知识:python 将某个字段存储为列表类型 实现存储数据格式为 { "_index": "nested-20180815", "_type": "stb-iptv-montor-m-gather-apk...mdiNested": dict_list } } actions.append(action) helpers.bulk(es_20, actions) 以上这篇python...实现将列表中各个值快速赋值给多个变量就是小编分享给大家全部内容了,希望能给大家一个参考。

    4.3K20

    Python列表赋值,复制,深拷贝以及5种浅拷贝详解

    Python列表赋值,复制,深拷贝以及5种浅拷贝详解 概述 在列表复制这个问题,看似简单复制却有着许多学问,尤其是对新手来说,理所当然事情却并不如意,比如列表赋值、复制、浅拷贝、深拷贝等绕口名词到底有什么区别和作用呢...列表赋值 # 定义一个新列表 l1 = [1, 2, 3, 4, 5] # 对l2赋值 l2 = l1 print(l1) l2[0] = 100 print(l1) 示例结果: [1, 2, 3, 4..., 5] [100, 2, 3, 4, 5] 可以看到,更改赋值L2后L1同样也会被更改,看似简单“复制”,在Python中,列表属于可变对象,而对可变对象复制其实就是将列表内存空间类似C中指针再次指向新变量名...,而不是诸如字符串这种不可变对象在复制时会创建新内存空间进行赋值。...浅拷贝 当列表元素为不可变对象时,我们可以用以下方法对列表进行赋值: import copy # 定义一个新列表 L0 = [1, 2, 3, 4, 5] print(L0) print('-'*40

    4.9K30

    Python:序列增量赋值

    增量赋值运算符有 += 和 *=。+= 背后特殊方法是 __iadd__,如果一个类没有实现 __iadd__ 方法,Python 会退一步调用 __add__ 方法。...1298277978824 id(c) = 1298277978696 id(c) = 1298277978632 id(d) = 1298277972872 id(d) = 1298277136616 了解了序列增量赋值...,我们来看 Leonardo Rochael 在 2013 年 Python 巴西会议上提到谜题: t = (1, 2, [30, 40]) t[2] += [50, 60] A. t 变成 (1,...因为 tuple 不支持对它元素赋值,所以会抛出 TypeError 异常 C. 以上两个都不是 D. A 和 B 都是对 估计很多人会跟我一样选 B,但其实答案是 D。...3、增量赋值不是一个原子操作,我们刚才也看到了,它虽然抛出了异常,但 t 值还是改变了。

    1.2K20

    Python 动态赋值陷阱

    花下猫语:在上一篇文章《Python与家国天下》第三节中,我借 Python 猫之口介绍了关于局部作用域变量解析问题,还引入了抽象语法树隐藏内容,最后触及了 CPython 底层实现原理边界...) ---- 在工作中, 有时候会遇到一种情况: 动态地进行变量赋值 , 不管是局部变量还是全局变量, 在我们绞尽脑汁时候, Python已经为我们解决了这个问题....Python命名空间通过一种字典形式来体现, 而具体到函数也就是locals() 和 globals(), 分别对应着局部命名空间和全局命名空间....于是, 我们也就能通过这些方法去实现我们"动态赋值"需求....从上面罗列出来几个关键语句字节码可以看出, 直接赋值/读取 和 通过locals()赋值/读取 本质是很大不同.

    1.4K30

    Python: 链式赋值

    在我们使用Python过程中, 经常遇到赋值语句, 就像下面的那样: a = 3 b = 3 可能你会觉得我又要说什么变量赋值就是引用, 这么简单知识就不讨论啦, 相信聪明大家肯定都知道, 我想讲的是链式赋值...有兴趣朋友可以自行上机试下, 正确答案是: i 值: 3 s 值: [1, 2, 3, 3, 5, 6] s列表, 并没有像我们想象中那样, 就i=0位置上元素, 变成3, 而是将i=3位置元素改成...第1~2行简单解释下: 分别LOAD_CONST5个数字, 组成一个列表, 赋值给s,再取一个0, 赋值给i.接下来就是我们关心, 也是带给我们意外代码....它会返回赋值结果3, 所以在它们链式赋值中, 是将右边表达式返回值, 再赋值给左边, 例如: a = s = 3 等价于: a = (s = 3) 也就是 s=3 返回3, 再赋值给a 而在python...---- 感谢@Daetalus童鞋指出问题: 支持表达式赋值Python语言核心,比如a = b + 3。

    1.2K10

    【爬虫军火库】生成指定日期间日期列表

    今天没能空下来时间写太多,所以只简单记录一个很具体需求: 指定了起止日期,如何生成一个日期列表。...这个需求是我之前在抓取一个环保历史数据时遇到: 如图,在这个页面上,我们需要手动通过日期控件选择日期,点击查询后,浏览器会向服务器发出POST请求,而POST数据便是这一天日期格式。...因此,假如我们需要自动化大量抓取数据,就需要实现生成指定日期间日期列表。...当时尝试了许多办法,都感觉不太方便,最后是这么实现(源自知乎某位匿名用户回答) import datetime def datelist(start, end): start_date =...查看当时环保数据爬虫详情:https://www.zhihu.com/question/41136540/answer/89765276

    1.4K70

    Python变量并列赋值疑问

    Python最引以为傲一个特性是可以原地交换两个变量值,既简洁又高效。这其中原因在于python变量存储是地址而非实际数据,所以当交换两个变量时实际上是交换了地址引用。...运行结果2 在尝试解释这个问题前,我们先试验一个python变量赋值小例子: ?...可以发现,python中对变量赋值实际上是取决于变量对应数值,当变量赋值一致时,无论来源如何(初次赋值、再次赋值或者是由其他计算得到),只要赋值相同就都指向同一地址。...所以,在python变量管理中,值地址决定了变量地址,而非变量存储了值大小。...所以,现在我们回过头来分析代码中那个坑,似乎可以做出如下推断: 无论是可变类型(列表、字典等)还是不可变类型(基本数据类型,整型、字符串等),都是基于值地址赋值和引用; 两个变量并列赋值时,先后顺序可能会有影响

    2.1K40

    Python 为什么会有个奇怪“...”对象?

    它是中文标点符号半个省略号,也即由英文 3 个点组成。如果你是第一次看到,很可能会觉得奇怪:这玩意是怎么回事?PS:如果你知道它,仔细看过本文后,你同样可能会觉得奇怪!...虽然官方说它们是同一个对象两种写法,而且说成是单例(singleton),但我还发现一个非常奇怪现象,与文档描述是冲突: ? 如你所见,赋值给 ......时会报错SyntaxError: cannot assign to Ellipsis ,然而 Ellipsis 却可以被赋值,它们行为根本就不同嘛!...出生在 Python 3 时代,或许在将来会完全取代 Ellipsis。目前两者共存,它们不一致行为值得我们注意。我建议:只使用"..."吧,就当 Ellipsis 已经被淘汰了。...对于列表和字典这样容器,如果其内部元素是可变对象的话,则存储是对可变对象引用。那么,当其内部元素又引用容器自身时,就会递归地出现无限循环引用。

    2K10

    python列表python列表所有详细操作

    列表所有操作 列表创建 方法一 list = [1,2,3] 方法二 使用list()函数 list = list() range()函数用法 range(start,end,step)...start :起始值 end:到end -1 结束 step:相邻两个数之间相差step个 列表索引和切片 索引 索引分为正向索引和反向索引。...索引起始值是0。 切片 列表切片可以从列表中取得多个元素并组成一个新列表。...运算符    说明 +    列表连接,合并两个列表 *    复制列表元素 []    索引列表元素 [ : ]    对列表进行切片 in    如果列表中包含给定元素,返回True...insert(index,obj)    将元素obj添加到列表index位置处。 append()函数,添加到列表最后。

    18420
    领券