全局字典不需要关键字global来修改吗? [复制]

2023-11-26

我想知道为什么我可以更改全局字典而不用global关键词?为什么其他类型必须这样做?这背后有什么逻辑吗?

例如。代码:

#!/usr/bin/env python3

stringvar = "mod"
dictvar = {'key1': 1,
           'key2': 2}

def foo():
    dictvar['key1'] += 1

def bar():
    stringvar = "bar"
    print(stringvar)

print(dictvar)
foo()
print(dictvar)

print(stringvar)
bar()
print(stringvar)

给出以下结果:

me@pc:~/$ ./globalDict.py 
{'key2': 2, 'key1': 1}
{'key2': 2, 'key1': 2}  # Dictionary value has been changed
mod
bar
mod

我期望的地方:

me@pc:~/$ ./globalDict.py 
{'key2': 2, 'key1': 1}
{'key2': 2, 'key1': 1}  # I didn't use global, so dictionary remains the same
mod
bar
mod

原因是该行

stringvar = "bar"

不明确,它可能指的是全局变量,or它可能会创建一个名为的新局部变量stringvar。在这种情况下,Python 默认假设它是局部变量,除非global关键字已被使用。

然而,该行

dictvar['key1'] += 1

是完全不含糊的。它可以仅引用全局变量dictvar, since dictvar该语句必须已经存在,才不会引发错误。

这并非特定于字典 - 列表也是如此:

listvar = ["hello", "world"]

def listfoo():
    listvar[0] = "goodbye"

或其他类型的物体:

class MyClass:
    foo = 1
myclassvar = MyClass()

def myclassfoo():
    myclassvar.foo = 2

每当使用变异操作而不是重新绑定操作.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

全局字典不需要关键字global来修改吗? [复制] 的相关文章

随机推荐

  • 如何将 JSON 对象推送到 JSONB 列中的嵌套数组

    我需要以某种方式将 JSON 对象推送到可能存在的 JSON 对象的嵌套数组 请参阅下面的 JSON 片段中的 页面 session id someuuid visitor ui 1 pages datetime 2016 08 13T19
  • 如何在 MathJax 中定义自定义宏

    我正在尝试定义 MathJax 中 LaTeX 文件中使用的自定义宏 可以定义简单的宏 单个参数 没有任何问题 例如 newcommand braket 1 langle 1 rangle as Macros braket langle 1
  • Spring MVC - 包括静态文件/ javascript 、 css

    我已经创建了 MVC 应用程序 我想将js或css文件包含到jsp中 我的静态文件位于 webapp js jquery js WEB INF jsp jsp 我的包含 jquery 的代码是 jquery js gt gt 我无法将 js
  • Android 权限和权限组之间的链接

    我是 Android 开发新手 我正在查看 android 清单权限 有两件事 权限和权限组 我知道该列表位于 http developer android com reference android Manifest permission
  • 具有并发请求的 Python XMLRPC

    我正在寻找一种方法来防止多个主机向 Python XMLRPC 侦听器同时发出命令 侦听器负责运行脚本以在该系统上执行任务 如果多个用户尝试同时发出这些命令 这些任务将会失败 有没有办法可以阻止所有传入请求 直到单个实例完成 我认为 pyt
  • 在 NSString 对象中查找子字符串

    我有一个 NSString 对象 我想通过定位一个单词来从中创建一个子字符串 例如 我的字符串是 狗吃了猫 我希望程序找到单词 ate 并创建一个子字符串 the cat 有人可以帮助我或给我一个例子吗 Thanks Sagiftw NSR
  • 使用 C# 列出回收站中的文件名,而不使用任何外部文件

    我想要一个使用 c 代码检索回收站 在 win 7 上 中的文件名的函数 该框架似乎没有包含任何内容来实现这一目标 目录 Getfiles 不会起作用 是吗 我发现自己有一个使用 windows shell32自动化 的代码 但这需要提供i
  • Play框架表单只有18个参数

    我观察到 当我向 Play Framework Form class 添加超过 18 个参数时 我会收到一个很长 对我来说难以理解 的编译错误 这是有记录的限制吗 我需要在表单帖子中接收多达 29 个参数 我不决定参数的设计和数量 因为我正
  • 如何将结构体成员设为私有?

    我在头文件中定义了一个结构 如下所示 typedef struct void data point 我想阻止其他人直接访问 data 所以我想我应该在 c 文件中声明结构并使用类似的东西extern typedef struct point
  • 模板中的 Django settings.py 变量

    我遇到了一个非常奇怪的错误 我在我的应用程序中定义了一个应用程序IDsettings py像这样的文件 CARDSPRING APP ID 这几乎适用于我网站上的每个页面 除了一个页面 奇怪的是 其他变量也起作用 在页面的脚本部分中 我有以
  • Android.mk - 构建目录中的所有源文件

    我正在使用 Android NDK 构建我的 cocos2dx 项目 在 Android mk 中 有一个 LOCAL SRC FILES 的定义 其中列出了每个 cpp 文件 每当我添加新的源文件时 我也需要将它添加到那里 它看起来像这样
  • SQL:如何为每天的每个组选择最大值?

    假设我有一个包含以下列的表 Name Date Number 并假设我们将以下数据插入到这些列中 Bob 2011 11 22 1 Bob 2011 11 22 5 Bob 2011 11 22 4 Bob 2011 11 22 3 Wen
  • 自动更新的 iOS 应用程序,用于企业分发

    是否有可能制作一个iOS应用企业分布透明地自我更新 说 更新 我的意思是完全更新其逻辑 这种方法的一个可能用途是远程维护的自助服务亭 iPad 不可能直接更新应用程序二进制文件 但我看到了一些可能性 具有单个 UIWebView 且逻辑在
  • 如何像 Facebook 上那样在 div 外部制作可滚动的 DIV 并带有滚动条?

    我想要一个可滚动的 div 但默认情况下滚动条应该位于浏览器的右侧 但不在 div 的右侧 我在 facebook 上看到过 ceter div contentArea 由右侧浏览器滚动条滚动 Facebook 的做法是让所有不滚动的内容都
  • Rails 单表继承 - 显式设置类型的最佳方法是什么?

    我在用单表继承在我的 Rails 应用程序中 并且想要显式设置实例的类型 我有以下内容 class Event lt ActiveRecord Base class SpecialEvent lt Event 它是通过单表继承来实现的 Sp
  • 我可以使用二进制在汇编中写入整数常量吗?

    我有一个作业要求定义 4 个整数 每个整数都有不同的字节长度 1 2 4 8 这段代码可以工作吗 segment data one db 1 two dw 01 four dd 1011 eight dq 01101110 global s
  • 我可以检测用户何时使用后退按钮进入页面吗?

    Edit 我真正需要知道的是 当用户通过后退按钮到达页面时 是否有任何 javascript 事件能够可靠地触发 我尝试过onload活动为body元素 但它不会在 Firefox 或 Safari 上触发 我正在使用一些旧代码 这些代码试
  • MongoDB E11000重复键错误

    我有一个模型在第一次发布后不断出错 我正在创建一个调度应用程序 该应用程序有 X 天 包含房间和房间的时间段 我遇到的问题是在数据库中创建日期对象 为了便于阅读 我只需要一个键值对 day model js var mongoose req
  • 现代 C++ 方法重复代码设定次数

    很简单 是否有一种更简单的方法来重复一个块一定次数 其中块内部不需要计数器变量 简单的解决方案当然是 for int i 0 i lt repetitions i do your thing i is not used here 然而 既然
  • 全局字典不需要关键字global来修改吗? [复制]

    这个问题在这里已经有答案了 我想知道为什么我可以更改全局字典而不用global关键词 为什么其他类型必须这样做 这背后有什么逻辑吗 例如 代码 usr bin env python3 stringvar mod dictvar key1 1