为什么这两个操作(append()分别+)给出不同的结果?
>>> c = [1, 2, 3]
>>> c
[1, 2, 3]
>>> c += c
>>> c
[1, 2, 3, 1, 2, 3]
>>> c = [1, 2, 3]
>>> c.append(c)
>>> c
[1, 2, 3, [...]]
>>>
Run Code Online (Sandbox Code Playgroud)
在最后一种情况下,实际上存在无限递归.c[-1]并且c是一样的.为什么它与+操作不同?
为什么以下抛出异常,虽然它成功了?
>>> t = ([1, 2, 3], 4)
>>> t[0] += [1]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'tuple' object does not support item assignment
>>> t
([1, 2, 3, 1], 4)
>>>
Run Code Online (Sandbox Code Playgroud) 我刚看到一些非常奇怪的东西.
>>> t = ([],)
>>> t[0].append('hello')
>>> t
(['hello'],)
>>> t[0] += ['world']
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'tuple' object does not support item assignment
>>> t
(['hello', 'world'],)
Run Code Online (Sandbox Code Playgroud)
为什么它会提升TypeError并改变list内部tuple?
我只是在翻译中玩弄并碰到了一些我不理解的东西.当我创建一个列表作为元素之一的元组,然后尝试更新该列表时,会发生一些奇怪的事情.例如,当我运行这个时:
tup = (1,2,3,[4,5])
tup[3] += [6]
Run Code Online (Sandbox Code Playgroud)
我明白了:
TypeError: 'tuple' object does not support item assignment
Run Code Online (Sandbox Code Playgroud)
这正是我的预期.然而,当我再次引用元组时,我得到:
>>> tup
(1, 2, 3, [4, 5, 6])
Run Code Online (Sandbox Code Playgroud)
所以即使python引发异常,列表实际上也已更新.这是如何运作的?我无法想象我实际上想要做这样的事情,但我仍然想了解发生了什么.谢谢.
我对修改元组成员有点困惑.以下不起作用:
>>> thing = (['a'],)
>>> thing[0] = ['b']
TypeError: 'tuple' object does not support item assignment
>>> thing
(['a'],)
Run Code Online (Sandbox Code Playgroud)
但这确实有效:
>>> thing[0][0] = 'b'
>>> thing
(['b'],)
Run Code Online (Sandbox Code Playgroud)
还有效:
>>> thing[0].append('c')
>>> thing
(['b', 'c'],)
Run Code Online (Sandbox Code Playgroud)
不起作用,并且有效(嗯?!):
>>> thing[0] += 'd'
TypeError: 'tuple' object does not support item assignment
>>> thing
(['b', 'c', 'd'],)
Run Code Online (Sandbox Code Playgroud)
看似与以前相同,但有效:
>>> e = thing[0]
>>> e += 'e'
>>> thing
(['b', 'c', 'd', 'e'],)
Run Code Online (Sandbox Code Playgroud)
那么,当你能够并且不能修改元组内的某些内容时,游戏的规则到底是什么?它似乎更像禁止使用赋值成员的赋值运算符,但最后两个案例让我感到困惑.
我正在阅读这篇有趣的帖子https://asmeurer.github.io/blog/posts/tuples/
脚注作者提出了这个例子
>>> t=1,2,[3,4]
>>> t
(1, 2, [3, 4])
>>> t[2]+=[5,6]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'tuple' object does not support item assignment
Run Code Online (Sandbox Code Playgroud)
虽然Python已经引发了异常但它确实改变了元组
>>> t
(1, 2, [3, 4, 5, 6])
Run Code Online (Sandbox Code Playgroud)
不确定这里发生了什么,这是一个错误吗?
2.7.10和3.5.1中的行为相同
如果我在元组中有一个列表,然后尝试将该列表与另一个列表连接起来,我会得到一个例外:
>>> a = ([1], [2])
>>> a[1] += [3]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'tuple' object does not support item assignment
Run Code Online (Sandbox Code Playgroud)
这是预期的:连接是创建一个新列表,元组是不可变的.但是,尽管有例外,元组已更新:
>>> print(a)
([1], [2, 3])
Run Code Online (Sandbox Code Playgroud)
为什么会这样?
python ×7
list ×4
tuples ×3
python-3.x ×2
append ×1
immutability ×1
mutable ×1
nested-lists ×1
python-2.7 ×1