现在有如下几个模块:

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. iOS 8 - Can't Install Enterprise App

    http://stackoverflow.com/questions/25733299/ios-8-cant-install-enterprise-app 版权声明:本文为博主原创文章,未经博主允许不 ...

  2. crawler 使用jQuery风格实现

    以前写过java版的crawler,最近看了Groovy的XmlSlurper,效果还是不太满意,直到这篇文章启发了我:how-to-make-a-simple-web-crawler-in-java ...

  3. 【零基础】简单说说一键果体APP的AI

    参考: https://www.jianshu.com/p/8c7a7cb7198c https://blog.csdn.net/gdymind/article/details/82696481 零. ...

  4. Vue.js 生命周期、计算属性及侦听器

    一.创建一个Vue实例 每个Vue应用都是使用Vue函数创建一个Vue实例.所有的Vue组件都是一个Vue实例,并且接受相同的选项对象(一些根实例特有的选项除外). 数据和方法 当一个实例被创建后,它 ...

  5. python异常值检验实战2_医美手术价格

    python信用评分卡建模(附代码,博主录制) https://study.163.com/course/introduction.htm?courseId=1005214003&utm_ca ...

  6. Win10蓝牙鼠标老是断连卡顿的解决方法

    一直用一个微软家的蓝牙鼠标,饱受鼠标卡顿困扰,今天找到了一个解决方案,用了下,效果显著.具体操作见下文. 原文地址:https://jingyan.baidu.com/article/c85b7a64 ...

  7. Oracle登录认证

    oracle 登录认证 Table of Contents 1. 简介 2. authentication_services 2.1. 不同登录方式的写法 3. sysdba角色登录认证 3.1. 无 ...

  8. Android提升Gradle编译速度或减少Gradle编译时间.md

    目录 Android如何提升Gradle编译速度或减少Gradle编译时间 最终优化方案 优化效果比对 将所有项目源码,各种缓存临时目录都移动到高性能SSD磁盘上 gradle.properties ...

  9. SSM整合junit单元测试之org.apache.ibatis.binding.BindingException: Invalid bound statement (not found):

    想用SSM做一点小测试,项目整合完毕,直接使用junit测试mybatis,出现如下错误(SuperTest类中进行了spring运行环境加载): 解决思路: 检查mapper接口与mapper.xm ...

  10. Spring + MyBatis 框架下处理数据库异常

    一.概述 使用JDBC API时,很多操作都要声明抛出java.sql.SQLException异常,通常情况下是要制定异常处理策略.而Spring的JDBC模块为我们提供了一套异常处理机制,这套异常 ...