首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么Python3.8.0允许在不使用“非本地”变量的情况下从函数作用域中更改可变类型?

为什么Python3.8.0允许在不使用“非本地”变量的情况下从函数作用域中更改可变类型?
EN

Stack Overflow用户
提问于 2020-10-12 18:55:36
回答 1查看 530关注 0票数 1

在下面的Python3.8.0.0脚本中,它不允许从子/嵌套函数的函数作用域中更改不可变变量,但是,修改可变类型元素可以很好地工作,而无需使用子/嵌套函数的非本地声明。有谁能解释一下,为什么是这样的?

代码语言:javascript
复制
def func():
        func_var1 = 18
        func_var2 = 'Python'
        func_var3 = {1,2,3,4,5,6}
        func_var4 = [1,2,3,4,5,6]
        func_var5 = {'P': 'Python', 'J': 'Java'}
        
        def sub_func():
            nonlocal func_var1
            func_var1 = 20
            print(func_var1)
    
            nonlocal func_var2
            func_var2 = 'Java'
            
            # For mutable types, why does it allow to update variable from enclosing function scope without nonlocal declaration? 
            func_var3.add(7) 
            print(func_var3)
    
            func_var4.append(7) 
            print(func_var4)
    
            func_var5.update({'G':'Go'})
            func_var5['R'] = 'Ruby'
            print(func_var5)
    
        sub_func()
    
func()

输出

代码语言:javascript
复制
20
{1, 2, 3, 4, 5, 6, 7}
[1, 2, 3, 4, 5, 6, 7]
{'P': 'Python', 'J': 'Java', 'G': 'Go', 'R': 'Ruby'}
EN

回答 1

Stack Overflow用户

发布于 2020-10-12 20:31:40

在Python中,关于全局/非本地名称和(Im)可变对象的规则在读写方面是不对称的。请注意,在Python中,变量的名称与名称所指向的对象/值(有时)之间有一个(有时)重要的区别,因此在以下中,我将尽量明确这一点,不要使用模糊的术语“变量”:

  • 所有的名字都是我们鬼魂所称的“读-全局”(和“读-非本地”),意思是不用使用global/nonlocal关键字就可以查找它们,并且可以检索它们的对象。相比之下,外部范围的名称不能重新分配,也就是说它们不能被覆盖以指向某个新对象。然而,在很少的情况下,我们确实需要这种能力,因此Python通过global/nonlocal关键字使其成为可能。我们可以说,代码全局x

使"read-global").

  • What成为“写全局的”(您仍然发现,虽然外部作用域的名称不能从内部范围内重新分配一个新对象,但对象本身实际上可能在内部作用域中发生变异(当然,如果所讨论的对象是可变的)。实际上,可变对象本身不属于任何给定范围。名称有作用域,对象没有作用域。

请注意,

这对于Python3.8甚至Python3来说并不是特殊的。然而,它对于Python来说并不是特殊的,对于嵌套函数来说并不特殊,但是也适用于例如,从更深的范围(比如函数或类)引用的模块级变量。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64323757

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档