Import copy, has the error TypeError: object does not support item assignment on output

Import copy, has the error TypeError: object does not support item assignment on output

我正在通过第 1 章中的一些核心模块学习 OReilly - Python 标准库。 我使用下面的代码 运行 成功。

import copy

a = [[1],[2],[3]]
b = copy.copy(a)
c = copy.copy(b)

print "\nbefore", "=>"
print a
print b
print c

# modify original
a[0][0] = 0
*a[1] = None*
a[2] = "Thanks"

print "after", "=>"
print a
print b
print c

输出为:

before =>
[[1], [2], [3]]
[[1], [2], [3]]
after =>
[[0], None, 'Thanks']
[[0], [2], [3]]

但是当我尝试使用 copy.deepcopy() 更改一些代码时,我在输出中遇到了错误,但与 copy.deepcopy() 无关。

import copy

a = [4],[7],[19]
b = copy.deepcopy(a)

print "\nBefore", "=>"
print a
print b

# modify the original
a[0][0] = 2
*a[1] = "I don't know how to say"*

print "After", "=>"
print a
print b

错误输出如下:

Before =>
([4], [7], [19])
([4], Traceback (most recent call last):
[7], [19])
  File "C:\Users\HP\workspace\Python-Student\OReilly - Python Standard Library - Source Code\Chapter 1. Core Modules.12 The copy Module\copy-example-2.py", line 12, in ?
    **a[1] = "I don't know how to say"**
TypeError: object does not support item assignment
a = [[1],[2],[3]]

a的类型是什么?这是一个列表。

a = [4],[7],[19]

a的类型是什么?它是一个元组。

元组是不可变的。你不能给它赋值。您错过了 [ ] 部分。
尝试:

a = [ [4],[7],[19] ] 

因为tuple are immutable

并且您正在创建一个元组:

a = [4],[7],[19]
print a
([4],[7],[19])

此处未显示错误,因为您正在更改 tuple

中的列表
a[0][0] = 2

问题是在第二个脚本中 a 是一个元组,因为您使用 -

创建 a
a = [4],[7],[19]

所以,如果你打印 a 就像 -

([4], [7], [19])

而且你不能直接给tuple赋值。

第一个代码有效,因为您正在创建 a 作为列表 -

a = [[1],[2],[3]]

元组是不可变的 ,你不能直接改变它的值,所以你不能做 -

a[1] = <something else>

当你做 a[0][0] 时不会导致错误,因为那时你不是直接修改 tuple , tuple 仍然指向同一个列表,而是你只是在修改列表0th 位置。

此错误与使用 copy.deepcopy() 无关,您应该创建 a 作为列表,就像在第一个代码中一样,第二个代码才能工作。

我们无法更新元组中的值,因为元组数据类型是不可变的

异常与复制语句无关,与元组数据类型有关

演示:

变量a作为列表,列表数据类型是可变的。

>>> a = [[1],[2],[3]]
>>> type(a)
<type 'list'>
>>> a
[[1], [2], [3]]
>>> a[2] = "Thanks"
>>> a
[[1], [2], 'Thanks']

变量a作为元组:

>>> a = [4],[7],[19]
>>> type(a)
<type 'tuple'>
>>> a
([4], [7], [19])
>>> a[2] = "Thanks"
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'tuple' object does not support item assignment
>>>