我是Python新手——作为一名教育工作者,试图编写Python脚本来对从在线投票平台下载的学生表现进行评分。我已经解决了大多数问题,直到出现这样的问题:我试图将 test1 的值复制到 test2 中而不引用,然后更改 test2 中的值。我希望 test2 可全局用于其他函数调用。
test1=[{'a':1,'b':2,'c':3},{'a':4,'b':5,'c':6}]
测试2=[]
def CopyList(test1,test2):
import copy
test2 =copy.deepcopy(test1)
test2[0]['d']= 4
print(test2)
复制列表(测试1,测试2)
... [{'a': 1, 'b': 2, 'c': 3, 'd': 4}, {'a': 4, 'b': 5, 'c': 6} ]
(到目前为止一切顺利!)
打印(测试1)
...[{'a': 1, 'b': 2, 'c': 3}, {'a': 4, 'b': 5, 'c': 6}]
(随心所欲,很好)
打印(测试2)
..[]
(原来的test2好像没有修改?)
我也尝试过 d.copy() 或列表切片 ([:])。 这两个方法似乎继续引用将被修改的原始列表(test1)。 在任何情况下都不会在函数外部修改 test2。 我也尝试过(for循环)方法:
test1=[{'a':1,'b':2,'c':3},{'a':4,'b':5,'c':6}]
测试2=[]
def CopyList(test1,test2):
ndict=len(test1)
test2.clear()
for i in range(ndict):
test2.append(test1[i])
test2[0]['d']= 4
print(test2)
此方法产生了这些结果 --
打印(测试1)
[{'a': 1, 'b': 2, 'c': 3, 'd': 4}, {'a': 4, 'b': 5, 'c': 6}]
(test1是如何修改的??)
打印(测试2)
[{'a': 1, 'b': 2, 'c': 3, 'd': 4}, {'a': 4, 'b': 5, 'c': 6}]
(好吧,这就是我想要的)
任何有关如何解决此问题的建议都将受到赞赏。
将 test2 作为参数传递给函数时,它与全局变量是同一对象。但是,当您分配
test2 = copy.deepcopy(test2)
时,您会创建一个新变量并覆盖旧变量。该变量与全局变量处于不同的作用域,并且不再与全局变量相同。因此,无法全局访问。
有两种方法可以解决这个问题:
test2[:] = copy.deepcopy(test2)
这只会更改列表的内容,而不会创建新列表。
global
关键字在全局范围内覆盖 test2:def CopyList(test1): global test2 test2 = copy.deepcopy(test1)
这将使您的
声明变得多余。但如果可能的话,您通常应该避免使用test2 = []
关键字。global