我正在通过第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\1.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
答案 0 :(得分:3)
这是因为tuple are immutable
你正在创建一个元组:
a = [4],[7],[19]
print a
([4],[7],[19])
此处未显示错误,因为您正在更改tuple
a[0][0] = 2
答案 1 :(得分:2)
a = [[1],[2],[3]]
是什么类型的?这是一个清单。
a = [4],[7],[19]
是什么类型的?这是一个元组。
元组是不可改变的。您无法为其分配价值。你错过了[]部分 尝试:
a = [ [4],[7],[19] ]
答案 2 :(得分:2)
问题是在第二个脚本a
中使用 - {/ p>创建a
时是一个元组
a = [4],[7],[19]
所以,如果你打印a
,那就像 -
([4], [7], [19])
您无法直接将值分配给tuple
。
第一个代码有效,因为您正在创建a
作为列表 -
a = [[1],[2],[3]]
元组是不可变的,你不能直接改变它的值,所以你不能做类似的事情 -
a[1] = <something else>
执行a[0][0]
时不会导致错误,因为当时你不是直接修改元组,元组仍会指向同一个列表,而是只修改{{1}列表1}}位置。
此错误与使用0th
无关,您应该像在第一个代码中一样创建copy.deepcopy()
列表,以便第二个代码可以使用。
答案 3 :(得分:1)
我们无法更新元组中的值,因为元组数据类型是不可变的
异常与复制语句无关,它与元组数据类型
有关<强>演示强>:
变量a作为列表,列表数据类型是可变的。
instance.opt = validated_data.get('OPT', 11)
变量a as as tuple:
>>> a = [[1],[2],[3]]
>>> type(a)
<type 'list'>
>>> a
[[1], [2], [3]]
>>> a[2] = "Thanks"
>>> a
[[1], [2], 'Thanks']