导入副本,有错误TypeError:对象不支持输出中的项目分配

时间:2015-09-01 08:52:27

标签: python python-2.4

我正在通过第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

4 个答案:

答案 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']