import xxx和from xxx import xx中修改被导入模块里面的变量的坑
现在有如下几个模块:
A.py
功能:定义全局变量,供其他模块使用
name = "张三"
lists = [1, 2, 3, 4, 5]
B.py
功能:打印A.py中的变量
from A import name,lists
def test():
    print("B:",name)
    print("B:",lists)
main.py
from A import name,lists
from B import test
if __name__ == '__main__':
    print("修改前-main:",name)
    name = "李四"
    print("修改后-main:", name)
    print("main:",lists)
    lists.append(100)
    # B模块中test的功能是打印A模块的name、lists
    test()
"""
修改前-main: 张三
修改后-main: 李四
main: [1, 2, 3, 4, 5]
B: 张三
B: [1, 2, 3, 4, 5, 100]
"""
运行后我们发现:
- A模块中的name被修改了,但在B模块中打印的还是原来的值。
- A模块中的lists添加了新的元素,显示正常。
原因:
- 使用from A import name 是在在当前模块创建一个name变量,该变量指向A模块中name变量所指向的值,即张三,修改name的值其实是修改name的引用,而字符串为不可变类型,name = "李四",是在内存中创建了字符串李四,然后name重新指向李四,所以之前的张三并没有改变。
- 而lists它是一个列表,是可变类型,所以在列表内添加新元素是可行的,但是lists是不能被重新赋值的,重新赋值时它的引用就会改变。
解决办法:
- 把定义全局变量的A.py使用import 导入。
就像这样:
B.py
import A
def test():
    print("B:",A.name)
    print("B:",A.lists)
main.py
import A
from B import test
if __name__ == '__main__':
    print("修改前-main:",A.name)
    name = "李四"
    print("修改后-main:", A.name)
    print("main:",A.lists)
    A.lists.append(100)
    # B模块中test的功能是打印A模块的name、lists
    test()
"""
修改前-main: 张三
修改后-main: 张三
main: [1, 2, 3, 4, 5]
B: 张三
B: [1, 2, 3, 4, 5, 100]
"""
import xxx和from xxx import xx中修改被导入模块里面的变量的坑的更多相关文章
- python中根据字符串导入模块module
		python中根据字符串导入模块module 需要导入importlib,使用其中的import_module方法 import importlib modname = 'datetime' date ... 
- python中关于传递参数模块argprase的一些小坑
		今天在写代码的时候遇到了一个关于parser的一些小坑,记录在此备用. 我们知道在python中可以用argprase来传递一些参数给代码执行,来看下面的例子,假设现在有一个test文件夹,下面有3个 ... 
- python settings 中通过字符串导入模块
		1. 项目文件结构 set_test ├─ main.py # 入口函数 │ ├─notify # 自定义的模块 │ ├─ email.py # 自定义模块 │ ├─ msg.py # 自定义模块 │ ... 
- Python 3基础教程20-Python中导入模块和包
		本文介绍Python中导入模块和包 #目录: # 导入模块和包--- # | # 上级包.上级模块.导入模块和包的init模块----- # | # 同级包.同级模块.上级包的init模块.test模 ... 
- 浅谈python中得import xxx,from xxx import xxx, from xxx import *
		在python中import跟from import都是用来导入的,但是导入的机制不同 1.import xxx:导入模块,或者文件夹,对于调用模块或者文件夹中子模块的变量或者函数,需要使用" ... 
- 升级CUDA版本导致VS2010错误:未找到导入的项目XXX,请确认<Import>声明中的路径正确,且磁盘上存在该文件
		转自:http://www.cnblogs.com/yeahgis/p/3853420.html VS2010错误:未找到导入的项目XXX,请确认<Import>声明中的路径正确,且磁盘上 ... 
- Python 导入模块的两种方法:import xxx 和from...import xxx
		import 方式导入模块 import tool.getsum.add # 导入模块,优先会从启动文件的当前目录开始寻找 # 如果找到,就使用 # 如果找不到,会在系统模块存放目录去 tool.ge ... 
- Node中导入模块require和import??
		转自:https://blog.csdn.net/wxl1555/article/details/80852326 S6标准发布后,module成为标准,标准的使用是以export指令导出接口,以im ... 
- VS发布网站时,报错提示:“未能将文件xxx复制到xxx,未能找到文件xx”三种解决方案!
		发布网站时候大家可能会遇到这样的情况,就是报错提示说:“未能将文件xxx复制到xxx,未能找到文件xx”,这个问题一般来说有三种解决方案,个人倾向第三种,如图: 解决方案如下: 方案一.把系统提示缺失 ... 
随机推荐
- TCP学习
			参考 https://coolshell.cn/articles/11564.html https://coolshell.cn/articles/11609.html 
- 【Docker】docker 的常用命令&操作
			一.在linux虚拟机上安装docker XShell1:检查内核版本,必须是3.10及以上 uname -r2:安装docker yum install docker3:输入y确认安装4:启动doc ... 
- Java中的<< 和 >> 和 >>> 分析理解
			Java中的<< 和 >> 和 >>> 详细分析 <<表示左移移,不分正负数,低位补0: 注:以下数据类型默认为byte-8位 左移时不管正负,低 ... 
- Linux系统是否被植入木马的排查流程梳理
			在日常繁琐的运维工作中,对linux服务器进行安全检查是一个非常重要的环节.今天,分享一下如何检查linux系统是否遭受了入侵? 一.是否入侵检查 1)检查系统日志 1 2 检查系统错误登陆日志,统计 ... 
- HearthBuddy版本收集
			Hearthbuddy-20190811-010-0b563c92.exe 20190810-003 SHA-256: b2a03c10124b038d2c48279cc50947907a55c8 ... 
- HearthBuddy CSharpCodeProvider  如何编译cs文件
			源码 源码1 namespace Hearthbuddy.Windows{ // Token: 0x02000041 RID: 65 public class MainWindow : W ... 
- Flutter移动电商实战 --(10)使用FlutterSwiper制作轮播效果
			1.引入flutter_swiper插件 flutter最强大的siwiper, 多种布局方式,无限轮播,Android和IOS双端适配. 好牛X得介绍,一般敢用“最”的一般都是神级大神,看到这个介绍 ... 
- vue-cli3.0 初体验
			vue-cli3.0 自我记录 其实在2018年8月10号,vue-cli3.0就已经面世了,由于项目中应用的全是2.x版本,所以并不了解3.0的vue-cli发生了什么变化,那今天尝试了下遇见的问题 ... 
- ftp服务器不能上传文件故障
			1.在客户端lftp命令无法put文件 原因:登陆用户无法读写 ftp服务器的文件夹,在服务器上增加权限 chmod 777 即可 还有一种方法:在 vsftp的配置文件里,设置可匿名读写 
- SpringMVC,SpringBoot上传文件简洁代码
			@RequestMapping("/updateAvatar.html") public String updateHeadUrl(MultipartFile avatar, Mo ... 
