希望有人能帮我。
我是Python的新手,我正在努力找出我做错了什么。
我已经搜索并发现Python变量可以链接在一起,这样更改一个变量就可以更改另一个变量,并且我已经使用id()
函数进行了大量测试,以掌握这个概念。但我似乎发现了一个例外我希望有人能解释。
首先,下面的工作如预期的那样制作了一个列表的独立副本。
>>> a = [0,0]
>>> b = a[:]
>>> print a is b
False
>>> b[0]=1
>>> print a
[0,0]
>>> print b
[1,0]
但是如果我稍微改变一下,使a
被列在一个列表中,它就会改变...
>>> a = [[0,0],[0,0]]
>>> b = a[:]
>>> print a is b
False
>>> b[0][0]=1
>>> print a
[[1, 0], [0, 0]]
>>> print b
[[1, 0], [0, 0]]
现在我们看到,b
的任何更新也将应用于a
,但是print a is b
的结果返回False
??我也对id()
进行了检查,所有东西都说它们彼此独立,但当我更新一个时,同样适用于另一个??
有人能解释这个吗??
注意到我正在运行http://labs.codecademy.com/#:workspace的这些,所以我的第一个想法是这只是他们网站上的一个bug,但我不知道?
编辑:
到目前为止,感谢你们所有人的精彩回答。太快了!我知道以前可能有人问过这个问题,但搜索起来很困难。
因为所有的答案都是正确的,所以我会等一天再阅卷。拥有最多+1的人将获得分数:)
发布于 2013-07-06 05:30:06
a
是一个列表列表。当您执行b=a[:]
时,您创建了一个新列表,但复制了元素。所以b
是一个不同的列表,但是元素(子列表)是相同的。
发布于 2013-07-06 05:32:00
在这两种情况下,您都创建了一个独立的列表。所以a is b
总是假的。
在第一种情况下,您将一些其他值放入其中一个列表中。
在第二种情况下,两个列表都包含相同的值。
这就好像你会写下
l = []
a = [l, l]
b = [l, l]
a is not b
,但它们包含相同的数据。
如果您现在修改l
,则可以通过所有a[0]
、a[1]
、b[0]
和b[1]
查看此更改。
发布于 2013-07-06 05:38:46
虽然a is b
返回False
,但a[0] is b[0]
返回True
。因此,当您更改b[0]
时,您必然会更改a[0]
>>> a = [[0,0],[0,0]]
>>> b = a[:]
>>> # a[0] is b[0]
>>> print a[0] is b[0]
True
>>> a.append('more stuff')
>>> print a
[[0, 0], [0, 0], 'more stuff']
>>> print b
[[0, 0], [0, 0]]
https://stackoverflow.com/questions/17497067
复制相似问题