python - 在同一个函数中使用全局变量和局部变量

时间:2018-03-28 16:31:09

标签: python

在python中我尝试这个:

admin = "Vaibhav"
def print_admin(default):
    # global admin
    if default == "default":
        print(admin)
    else:
        admin = "other"
        print(admin)
print_admin("")
print_admin("default")

它给了我一个错误:

error:UnboundLocalError: local variable 'admin' referenced before assignment

如果我使用global关键字,那么它在两种情况下都只使用global。 如果参数和全局(“Vaibhav”)中没有给出“default”,我希望能够使用本地(“其他”)。

这在javascript中完美无效,但在python中无效。

用于执行相同操作的Javascript代码:

let admin_name = "Vaibhav";

function printAdminName(admin_name_default) {
    if (admin_name_default != "default") {
        let admin_name = "Other";
        console.log(admin_name)
    }
    else {
        console.log(admin_name);
    }
}
printAdminName("default");
printAdminName();

输出: Vaibhav的 其他

**我也想知道为什么这个在javascript而不是python中工作,因为两者都是非常相似的语言。我想知道这个概念有什么不同。因为我花了很多时间逻辑地弄清楚它。

2 个答案:

答案 0 :(得分:1)

谈论变量的范围:

admin = "Vaibhav"
def print_admin(default):
    if default == "default":
        ## This is global
        global admin
        print(admin)
    else:
        ## This is local to your function
        print_admin.admin = "other"
        print(print_admin.admin)
print_admin("")
print_admin("default")

虽然我不太明白你为什么要在这个函数中注册一个全局变量,但是如果由于某种原因你必须使用声明来限制你的局部变量。

答案 1 :(得分:0)

在Python中,您不能使用相同的名称来引用本地变量和全局变量。使用例如global admin强制所有出现的admin引用全局变量,这意味着更改admin的值也会更改全局定义的admin,这似乎不是什么你想要的。

完全有可能(和Pythonic)读取全局变量而不写入它们(更改它们),在这种情况下不需要global关键字。考虑

admin = "Vaibhav"
def print_admin(default):
    if default == "default":
        # Read in the global admin
        admin_local = admin
    else:
        admin_local = "other"
    print(admin_local)
print_admin("")
print_admin("default")

在这里,我们通过不同地命名它们来区分admin的全局和本地版本。当您希望将两者都称为不同的变量时,这是必须的。