现在有如下几个模块:

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中修改被导入模块里面的变量的坑的更多相关文章

  1. python中根据字符串导入模块module

    python中根据字符串导入模块module 需要导入importlib,使用其中的import_module方法 import importlib modname = 'datetime' date ...

  2. python中关于传递参数模块argprase的一些小坑

    今天在写代码的时候遇到了一个关于parser的一些小坑,记录在此备用. 我们知道在python中可以用argprase来传递一些参数给代码执行,来看下面的例子,假设现在有一个test文件夹,下面有3个 ...

  3. python settings 中通过字符串导入模块

    1. 项目文件结构 set_test ├─ main.py # 入口函数 │ ├─notify # 自定义的模块 │ ├─ email.py # 自定义模块 │ ├─ msg.py # 自定义模块 │ ...

  4. Python 3基础教程20-Python中导入模块和包

    本文介绍Python中导入模块和包 #目录: # 导入模块和包--- # | # 上级包.上级模块.导入模块和包的init模块----- # | # 同级包.同级模块.上级包的init模块.test模 ...

  5. 浅谈python中得import xxx,from xxx import xxx, from xxx import *

    在python中import跟from import都是用来导入的,但是导入的机制不同 1.import xxx:导入模块,或者文件夹,对于调用模块或者文件夹中子模块的变量或者函数,需要使用" ...

  6. 升级CUDA版本导致VS2010错误:未找到导入的项目XXX,请确认<Import>声明中的路径正确,且磁盘上存在该文件

    转自:http://www.cnblogs.com/yeahgis/p/3853420.html VS2010错误:未找到导入的项目XXX,请确认<Import>声明中的路径正确,且磁盘上 ...

  7. Python 导入模块的两种方法:import xxx 和from...import xxx

    import 方式导入模块 import tool.getsum.add # 导入模块,优先会从启动文件的当前目录开始寻找 # 如果找到,就使用 # 如果找不到,会在系统模块存放目录去 tool.ge ...

  8. Node中导入模块require和import??

    转自:https://blog.csdn.net/wxl1555/article/details/80852326 S6标准发布后,module成为标准,标准的使用是以export指令导出接口,以im ...

  9. VS发布网站时,报错提示:“未能将文件xxx复制到xxx,未能找到文件xx”三种解决方案!

    发布网站时候大家可能会遇到这样的情况,就是报错提示说:“未能将文件xxx复制到xxx,未能找到文件xx”,这个问题一般来说有三种解决方案,个人倾向第三种,如图: 解决方案如下: 方案一.把系统提示缺失 ...

随机推荐

  1. mysql 5.7.16 安装配置

    环境变量在path中添加一个 E:\soft\mysql-5.7.16-winx64\mysql-5.7.16-winx64\bin 查看mysql版本mysql -V 生成无密码账户进入到mysql ...

  2. 【Android】【踩坑日记】RecyclerView获取子View的正确姿势

    开发过程中发现RecyclerView.getChildAt(position)为空的情况,但是明明这个position却没有越界. 解决办法:用recycler.getLayoutManager() ...

  3. Fiddler主界面图标简单说明

    Fiddler主界面图标简单说明: 名称 含义 # 抓取HTTP Request的顺序,从1开始,以此递增 Result HTTP状态码 Protocol 请求使用的协议,如HTTP/HTTPS/FT ...

  4. dp,滚动数组优化

    51Nod1084矩阵取数问题 V2 题意: 一个M*N矩阵中有不同的正整数,经过这个格子,就能获得相应价值的奖励,先从左上走到右下,再从右下走到左上.第1遍时只能向下和向右走,第2遍时只能向上和向左 ...

  5. postgresql获取表最后更新时间(通过触发器将时间写入另外一张表)

    通过触发器方式获取表最后更新时间,并将时间信息写入到另外一张表 一.创建测试表和表记录更新时间表 CREATE TABLE weather( city varchar(80), temp_lo int ...

  6. No hash for parcel CDH-XXX.parcel.torrent

    在安装 CDH 时,到 Install Parcels 这一步,分发 Parcels 一直过不去,界面一直报 Failure due to stall on seeded torrent,查看日志一直 ...

  7. 如何快速查找到HTML头尾对应标签?

    在使用Atom编辑器整理HTML代码的时候,希望快速找到HTML头尾对应的标签.  ctrl+m 试试看 

  8. Ajax案例-基于HTML,以GET或POST方式,检查注册用户名是否在数据库中已存在

    08_register.jsp <%@ page language="java" pageEncoding="UTF-8"%> <!DOCTY ...

  9. java.lang.RuntimeException: org.dom4j.DocumentException: 1 字节的 UTF-8 序列的字节 1 无效。

    向一个XML文件写入出现异常 解决办法:使用记事本打开该XML文件,另存为,编码选择UTF-8 java.lang.RuntimeException: org.dom4j.DocumentExcept ...

  10. unity2d教程

    https://segmentfault.com/a/1190000003965359