修改(全局)字典列表中的值而不引用

问题描述 投票:0回答:1

我是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}]

(好吧,这就是我想要的)

任何有关如何解决此问题的建议都将受到赞赏。

list dictionary reference copy global
1个回答
0
投票

将 test2 作为参数传递给函数时,它与全局变量是同一对象。但是,当您分配

test2 = copy.deepcopy(test2)
时,您会创建一个新变量并覆盖旧变量。该变量与全局变量处于不同的作用域,并且不再与全局变量相同。因此,无法全局访问。

有两种方法可以解决这个问题:

  1. 您可以修改现有变量:

test2[:] = copy.deepcopy(test2)

这只会更改列表的内容,而不会创建新列表。

  1. 您可以使用
    global
    关键字在全局范围内覆盖 test2:
def CopyList(test1):
   global test2
   test2 = copy.deepcopy(test1)  

这将使您的

test2 = []
声明变得多余。但如果可能的话,您通常应该避免使用
global
关键字。

© www.soinside.com 2019 - 2024. All rights reserved.