希望有人能帮我。
我是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
复制相似问题