【问题标题】:How not to change outer values?如何不改变外部价值观?
【发布时间】:2015-11-25 17:37:08
【问题描述】:

我是 Python 新手,因此我的问题看起来很愚蠢。 我尝试制作一些制作二维数组的程序。一个函数将项目放入列表并返回一个数组。然后,第二个函数将第一个函数的结果放入外部列表中。 我的程序如下所示:

def get_matrix():
    d = some_dict
    matrix = list()
    while len(matrix)<3:
        row = get_row(d)
        matrix.append(row)
    return matrix

def get_row(dict):
    array = list()
    for t in range(3):
        a = dict.popitem()
        array.append(a)
    return array

some_dict = dict()

for x in range(9):
    some_dict[x] = "a"+str(x)

print(some_dict)

print(get_matrix())

效果很好。但是,如果我不想更改外部函数中的列表 d 而只是这样做:

def get_matrix():
    d = some_dict
    matrix = list()
    while len(matrix)<3:
        row = get_row(d)
        matrix.append(row)
        for x in row:
            d.pop(x)
    return matrix

换句话说,我想将整个 dict 保留在外部函数中。 其实我想知道如果我们只改变内部函数参数给出的dict,为什么外部值会改变?

【问题讨论】:

  • 你能举一个输入和预期输出的例子吗?这样问题就更容易理解了。
  • 请阅读this
  • 题外话:不要给变量与dict这样的Python内置函数同名,这只会让你伤心。
  • @Adam,感谢您的回复,但我想我已经得到了答案
  • @Pynchia,是的,我的代码并不完美,但在这个示例中,我确实最小化了我的主要代码。

标签: python arrays list function scope


【解决方案1】:

您正在内部函数中弹出 dict 的项目。由于您将一个可变对象(dict)的句柄传递给您的 get_row() 函数,因此弹出也会影响外部 get_matrix 中的 dict。

请注意,作为复杂对象的 dict 在这方面的行为与不可变参数(int、float、str 等)不同。它们的值保持不变。

你可以传递你的字典的副本

row = get_row(copy.deepcopy(d))

如此处所述:Understanding dict.copy() - shallow or deep?。 顺便说一句,您可以在不弹出它们的情况下访问 dict 中的值

def get_row(dict):
    ...
    for t in range(3):
         ...
         # a = dict.popitem()
         a = dict[t] 

这也将使字典不受伤害。

【讨论】:

  • Python 中没有“复杂”和“原始类型”之类的东西,一切都是对象。使浮点数、整数或字符串“表现”不同的是它们是不可变的。因为它们是不可变的,所以你不能改变它们(是的......),无论是在被调用者还是在调用者中 - 你是不可变的,句号。
  • 你是对的 - 我已经相应地编辑了我的答案。
猜你喜欢
  • 2021-09-12
  • 1970-01-01
  • 2021-09-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多