簡體   English   中英

在函數中用python修改全局字典

[英]Modifying global dictionary in python within a function

#!/usr/bin/env python

def modify_dict():

    d['two'] = 2

d = {'one':1}

modify_dict()

print d

我懂了

$ ./globaltest.py 
{'two': 2, 'one': 1}

我希望只看到{'one':1}因為d在函數中未聲明為全局。 為什么d同時獲得兩個鍵值對?

看一下python的數據模型 字典和列表是可變對象,這就是為什么例如全局定義的字典不需要聲明為global 它們的內容可以隨時更改。

要了解可變性,請考慮python中的字符串。 它們是一個不變的對象。 例如,您可以替換給定字符串的內容,但這樣做時,解釋程序將創建一個新的字符串對象,從而為該字符串對象賦予一個新的標識(並因此賦予一個內存地址)。

>>> s = "foo"
>>> id(s)
140202745404072
>>> s = "bar"
>>> id(s)
140202745404112

我之前已經回答了幾個 類似的問題,所以請看看是否可以從中找到更多信息。

一個快速的解決方法是在功能的本地范圍內復制字典。

import copy

d = {'one':1}

def modify_dict():
    local_d = copy.deepcopy(d)
    local_d['two'] = 2
    print local_d

modify_dict()
print d

您將看到以下輸出:

>>>{'two': 2, 'one': 1}
>>>{'one': 1}

Python搜索變量基於LEGB規則:

Local, Enclosing functions, Global, Built-in

調用函數時,它將嘗試查找名為d的變量,並且自從在調用函數之前創建d以來便會在全局范圍內查找。 並且由於d是可變的,因此它將被更新。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM