☆─────────────────────────────────────☆
howfar (howfaraway) 于 (Fri Jan 5 08:57:53 2024) 提到:
程序很简单,
一个主程序, 只有数据定义的部分,
其他都包装进一个函数a,
这个函数也只有一个函数b,也只调用了一次,
函数a 一开始就定义了变量var1为全局变量,并赋值为None
函数b一开始同样说明了var1为全局变量,
但每次调试都报错, var1没有被定义.
进入函数b后才报错的.
啥问题?
全局变量又不是什么复杂概念
☆─────────────────────────────────────☆
howfar (howfaraway) 于 (Fri Jan 5 09:20:35 2024) 提到:
同样定义了另一个变量,并在函数a里赋值为零, 函数b就报错,
【 在 howfar 的大作中提到: 】
: 程序很简单,
: 一个主程序, 只有数据定义的部分,
: 其他都包装进一个函数a,
: ...................
☆─────────────────────────────────────☆
dabada (Da Bada) 于 (Fri Jan 5 09:23:18 2024) 提到:
万不得已才用全局变量吧?
而且,是不是理论上所有的全局变量都能被传值或者传地址替代?
【 在 howfar 的大作中提到: 】
: 同样定义了另一个变量,并在函数a里赋值为零, 函数b就报错,
☆─────────────────────────────────────☆
howfar (howfaraway) 于 (Fri Jan 5 09:29:41 2024) 提到:
定义后子函数不认, 不知道哪儿出了问题.
【 在 dabada 的大作中提到: 】
: 万不得已才用全局变量吧?
: 而且,是不是理论上所有的全局变量都能被传值或者传地址替代?
:
☆─────────────────────────────────────☆
iMx (围城) 于 (Fri Jan 5 09:52:32 2024) 提到:
在a里定义的b?
【 在 howfar 的大作中提到: 】
: 定义后子函数不认, 不知道哪儿出了问题.
☆─────────────────────────────────────☆
howfar (howfaraway) 于 (Fri Jan 5 10:27:21 2024) 提到:
在函数a里,
from 函数b import 函数b
【 在 iMx 的大作中提到: 】
: 在a里定义的b?
:
☆─────────────────────────────────────☆
dabada (Da Bada) 于 (Fri Jan 5 10:28:26 2024) 提到:
这是什么语法?
【 在 howfar 的大作中提到: 】
: 在函数a里,
: from 函数b import 函数b
☆─────────────────────────────────────☆
howfar (howfaraway) 于 (Fri Jan 5 10:34:31 2024) 提到:
这个一直这么用的,
都好好的啊, IDE也没报错
应该是?
【 在 dabada 的大作中提到: 】
: 这是什么语法?
:
☆─────────────────────────────────────☆
fhd (疯了!) 于 (Fri Jan 5 10:49:56 2024) 提到:
a没有被执行就执行了b呗
【 在 howfar 的大作中提到: 】
: 程序很简单,
: 一个主程序, 只有数据定义的部分,
: 其他都包装进一个函数a,
: ...................
☆─────────────────────────────────────☆
fhd (疯了!) 于 (Fri Jan 5 10:51:16 2024) 提到:
你这是另一个py文件?那b用不到a里面的全局变量啊。
【 在 howfar 的大作中提到: 】
: 在函数a里,
: from 函数b import 函数b
☆─────────────────────────────────────☆
dabada (Da Bada) 于 (Fri Jan 5 10:54:14 2024) 提到:
翻译过来叫“引入模块”吧
不是引入函数,更不是声明函数
【 在 howfar 的大作中提到: 】
: 这个一直这么用的,
: 都好好的啊, IDE也没报错
: 应该是?
: ...................
☆─────────────────────────────────────☆
howfar (howfaraway) 于 (Fri Jan 5 11:00:16 2024) 提到:
对, 是把函数单独做了个py文件
好像没有按照规范, GPT的意思要用类, 还要在主程序声明
但之前没有定义全局变量时, 程序也没出过错.
那现在怎么办呢? import也不行吗?
【 在 fhd 的大作中提到: 】
: 你这是另一个py文件?那b用不到a里面的全局变量啊。
☆─────────────────────────────────────☆
iMx (围城) 于 (Fri Jan 5 11:35:23 2024) 提到:
你用global关键字了码
【 在 howfar 的大作中提到: 】
: 对, 是把函数单独做了个py文件
: 好像没有按照规范, GPT的意思要用类, 还要在主程序声明
: 但之前没有定义全局变量时, 程序也没出过错.
: ...................
☆─────────────────────────────────────☆
howfar (howfaraway) 于 (Fri Jan 5 11:46:08 2024) 提到:
嗯, 当然用了关键字, 虽然水平是差, 这还不至于差到这地步
我的子函数是独立文件,
好像说, 子函数在独立文件中, 全局变量也得用形参的方式传递,
如果是形参, 那就根本不需要全局变量了.
【 在 iMx 的大作中提到: 】
: 你用global关键字了码
:
☆─────────────────────────────────────☆
freesand (freesand) 于 (Fri Jan 5 11:58:38 2024) 提到:
global并不是定义名称,而是声明绑定到最高层级的现有名称,你导入另一个文件中的函数,并没有导入那个名称,于是报错,from 文件 import 名称 才是正确写法
☆─────────────────────────────────────☆
howfar (howfaraway) 于 (Fri Jan 5 12:12:16 2024) 提到:
是不是说,
在函数a里定义的全局变量,
在函数a的子函数b里, 要加上 from fun_a import global_var
然后以 fun_a.global_var 使用修改函数a 的定义的全局变量, 然后就无需用形参.
【 在 freesand 的大作中提到: 】
: global并不是定义名称,而是声明绑定到最高层级的现有名称,你导入另一个文件中的函数,并没有导入那个名称,于是报错,from 文件 import 名称 才是正确写法
☆─────────────────────────────────────☆
freesand (freesand) 于 (Fri Jan 5 12:15:57 2024) 提到:
应该是 global global_var
☆─────────────────────────────────────☆
Madlee (无竹居士) 于 (Fri Jan 5 16:38:45 2024) 提到:
你是不是都没在函数外面定义这个变量?
☆─────────────────────────────────────☆
howfar (howfaraway) 于 (Fri Jan 5 16:48:28 2024) 提到:
程序结构很简单,
主程序, 主程序调用子函数a , 子函数a调用它的子函数b
就这么点儿事儿.
只是它们是各自成独立的文件, 要是都在一个main()里估计没这个问题了,
现在希望在b里修改a的一个变量矩阵 varx
函数外面是指文件 def a()的前面吗? varx=None
然后再到def a() 去 global
b 里需要声明 varx 吗? 在哪儿声明,
【 在 Madlee 的大作中提到: 】
: 你是不是都没在函数外面定义这个变量?
☆─────────────────────────────────────☆
poggy (P股决定NoZ) 于 (Fri Jan 5 18:19:44 2024) 提到:
【 在 howfar 的大作中提到: 】
: 程序结构很简单,
: 主程序, 主程序调用子函数a , 子函数a调用它的子函数b
: 就这么点儿事儿.
: ...................
说了半天, 你这是概念混乱,
这个不叫子函数,这叫子模块定义的函数。
子函数,是在函数体里面定义的函数,例如:
def a():
some codes in a
def b():
implement b codes
python 没有什么复杂的上下文概念, 所谓全局变量也罢, 函数也罢, 都是一个对象,
只不过函数对象是callable的, 或者实现了()这个特殊函数(其实如果对象实现了这个函数,甚至也能当函数用)。
这些对象, 实际就是按照一个字典进行管理的,你使用dir()就能看到暴露出来的模块,变量。
☆─────────────────────────────────────☆
flw (帅五进九) 于 (Fri Jan 5 18:44:36 2024) 提到:
同意。
本质上还是傲慢,用 Python 又不肯学 Python,
生吞又搞不定。
话说花点时间看教程会死吗?
概念这么混乱。
【 在 poggy 的大作中提到: 】
: 标 题: Re: 全局变量是坑?
: 发信站: 水木社区 (Fri Jan 5 18:19:44 2024), 转信
:
:
: 【 在 howfar 的大作中提到: 】
: : 程序结构很简单,
: : 主程序, 主程序调用子函数a , 子函数a调用它的子函数b
: : 就这么点儿事儿.
: : ...................
:
: 说了半天, 你这是概念混乱,
: 这个不叫子函数,这叫子模块定义的函数。
: 子函数,是在函数体里面定义的函数,例如:
: def a():
: some codes in a
: def b():
: implement b codes
: python 没有什么复杂的上下文概念, 所谓全局变量也罢, 函数也罢, 都是一个对象,
: 只不过函数对象是callable的, 或者实现了()这个特殊函数(其实如果对象实现了这个函数,甚至也能当函数用)。
: 这些对象, 实际就是按照一个字典进行管理的,你使用dir()就能看到暴露出来的模块,变量。
: --
:
: ※ 来源:·水木社区
http://www.mysmth.net·[FROM: 115.171.244.*]
☆─────────────────────────────────────☆
freesand (freesand) 于 (Fri Jan 5 20:32:13 2024) 提到:
参考这样
# mod_a.py
x = 0
# mod_b.py
from mod_a import x
def func_b():
global x
x += 1
func_b()
print(x)
☆─────────────────────────────────────☆
howfar (howfaraway) 于 (Fri Jan 5 21:46:57 2024) 提到:
谢谢指点,
很久前还旁听过面向对象的课程,也就是建立了类的概念.
连上手实现一个最简单的类都没做过.
【 在 poggy 的大作中提到: 】
:
: 说了半天, 你这是概念混乱,
: 这个不叫子函数,这叫子模块定义的函数。
: ...................
☆─────────────────────────────────────☆
howfar (howfaraway) 于 (Fri Jan 5 21:49:57 2024) 提到:
谢谢,
下午我按你前面的思路测试过, 不知道哪儿的问题, 好像没弄对.
我再试试.
【 在 freesand 的大作中提到: 】
: 参考这样
:
# mod_a.py
: x = 0
: ...................
☆─────────────────────────────────────☆
howfar (howfaraway) 于 (Sat Jan 6 11:56:24 2024) 提到:
测试了一下
from abcx import func_b
x=0
func_b()
print(x)
# abcx.py
from tmp1 import x
def func_b():
global x
x += 1
ImportError: cannot import name 'func_b' from partially initialized module 'abcx' (most likely due to a circular import) (C:\Users\86139\spy73\anaTF\abcx.py)
存在循环导入的问题,
【 在 freesand 的大作中提到: 】
: 参考这样
: [code=python]# mod_a.py
: x = 0
: ...................
☆─────────────────────────────────────☆
iMx (围城) 于 (Sat Jan 6 12:40:15 2024) 提到:
ai这么说,不知道对不对
在 Python 中,当你在一个模块中定义了一个全局变量,并在另一个模块中引用它时,你实际上是在引用那个全局变量的值。这意味着,如果你在一个模块中改变了全局变量的值,那么在其他模块中引用的也是这个改变后的值。
但是,如果你在一个模块中定义了一个函数,并在该函数中引用了另一个模块的全局变量,那么你实际上是在引用那个模块的全局变量,而不是本模块的全局变量。即使两个模块有同名的全局变量,它们也是两个不同的变量,分别存在于各自的命名空间中。
以下是一个简单的示例来说明这一点:
python
# moduleA.py
global_var = "Hello from moduleA"
def print_global_var():
print(global_var)
# moduleB.py
import moduleA
moduleA.global_var = "Hello from moduleB"
moduleA.print_global_var() # 输出 "Hello from moduleB"
在上面的示例中,moduleA.py 和 moduleB.py 都有同名的全局变量 global_var。在 moduleB.py 中,我们导入了 moduleA 并修改了它的全局变量。然后,我们调用 moduleA.print_global_var(),输出的是 "Hello from moduleB",而不是 "Hello from moduleA"。这说明我们实际上是在引用 moduleB 的全局变量,而不是 moduleA 的全局变量。
【 在 howfar 的大作中提到: 】
: 测试了一下
: from abcx import func_b
: x=0
: ...................
☆─────────────────────────────────────☆
howfar (howfaraway) 于 (Sat Jan 6 12:50:06 2024) 提到:
嗯, 看了,
现在的问题不是全局变量到底在其他模块能不能修改的, 修改的是什么的问题
我遇到的问题是 , 解释器不认可两个模块相互导入, 认为是循环导入, 报错, 根本执行不了一条语句,
哪怕是解释语言
【 在 iMx 的大作中提到: 】
: ai这么说,不知道对不对
: 在 Python 中,当你在一个模块中定义了一个全局变量,并在另一个模块中引用它时,你实际上是在引用那个全局变量的值。这意味着,如果你在一个模块中改变了全局变量的值,那么在其他模块中引用的也是这个改变后的值。
: 但是,如果你在一个模块中定义了一个函数,并在该函数中引用了另一个模块的全局变量,那么你实际上是在引用那个模块的全局变量,而不是本模块的全局变量。即使两个模块有同名的全局变量,它们也是两个不同的变量,分别存在于各自的命名空间中。
: ...................
☆─────────────────────────────────────☆
howfar (howfaraway) 于 (Sat Jan 6 13:01:50 2024) 提到:
你这里的例子我试了,没问题,
【 在 iMx 的大作中提到: 】
: ai这么说,不知道对不对
: 在 Python 中,当你在一个模块中定义了一个全局变量,并在另一个模块中引用它时,你实际上是在引用那个全局变量的值。这意味着,如果你在一个模块中改变了全局变量的值,那么在其他模块中引用的也是这个改变后的值。
: 但是,如果你在一个模块中定义了一个函数,并在该函数中引用了另一个模块的全局变量,那么你实际上是在引用那个模块的全局变量,而不是本模块的全局变量。即使两个模块有同名的全局变量,它们也是两个不同的变量,分别存在于各自的命名空间中。
: ...................
☆─────────────────────────────────────☆
howfar (howfaraway) 于 (Sat Jan 6 13:16:36 2024) 提到:
它的这个情况和我的情况有些区别,
这里的a,b是独立的,单独执行b, 得到的结果能理解.
我的情况是 a的值, 在b里修改, 再到a里查看b修改的情况.
a要import b, b要import a 中的变量, import自身形成了环.
【 在 iMx 的大作中提到: 】
: ai这么说,不知道对不对
: 在 Python 中,当你在一个模块中定义了一个全局变量,并在另一个模块中引用它时,你实际上是在引用那个全局变量的值。这意味着,如果你在一个模块中改变了全局变量的值,那么在其他模块中引用的也是这个改变后的值。
: 但是,如果你在一个模块中定义了一个函数,并在该函数中引用了另一个模块的全局变量,那么你实际上是在引用那个模块的全局变量,而不是本模块的全局变量。即使两个模块有同名的全局变量,它们也是两个不同的变量,分别存在于各自的命名空间中。
: ...................
☆─────────────────────────────────────☆
nanSHoua (油菜南) 于 (Sat Jan 6 14:51:56 2024) 提到:
我咋觉得你这个再得加个c 过度一下
这个不是python的问题。
【 在 howfar (howfaraway) 的大作中提到: 】
: 发信人: howfar (howfaraway), 信区: Python
: 标 题: Re: 全局变量是坑?
: 发信站: 水木社区 (Sat Jan 6 13:16:36 2024), 转信
:
☆─────────────────────────────────────☆
iMx (围城) 于 (Sat Jan 6 19:00:05 2024) 提到:
a要import b, b要import a,应该是伪需求
你就不应该这么写程序
【 在 howfar 的大作中提到: 】
: 它的这个情况和我的情况有些区别,
: 这里的a,b是独立的,单独执行b, 得到的结果能理解.
: 我的情况是 a的值, 在b里修改, 再到a里查看b修改的情况.
: ...................
☆─────────────────────────────────────☆
freesand (freesand) 于 (Sat Jan 6 19:57:29 2024) 提到:
我之前错误理解了你的意图,再重新解释一下:Python中模块具有最高层级,算是唯一的全局对象,确实不存在你所说的“全局变量”,global语句也只是将名称绑定到模块级命名空间而已。
你可以用一个单独模块来存放需要共享的东西:
[code=python]# vars.py
x = 0
# abcx.py
import vars
def func_b():
vars.x += 1
# tmp1.py
from abcx import func_b
import vars
func_b()
print(vars.x)
※ 来源:·水木社区
http://www.mysmth.net·[FROM: 39.183.155.*]
☆─────────────────────────────────────☆
galaxy123 (galaxy123) 于 (Sat Jan 6 23:03:30 2024) 提到:
别用全局变量。都用类封装,走标准写法。
【 在 howfar (howfaraway) 的大作中提到: 】
: 发信人: howfar (howfaraway), 信区: Python
: 标 题: 全局变量是坑?
: 发信站: 水木社区 (Fri Jan 5 08:57:53 2024), 转信
:
☆─────────────────────────────────────☆
howfar (howfaraway) 于 (Sun Jan 7 00:34:12 2024) 提到:
明白了,
其实也不是必须要怎么样,只是不懂又稀里糊涂的遇见了问题啊
【 在 freesand 的大作中提到: 】
: 我之前错误理解了你的意图,再重新解释一下:Python中模块具有最高层级,算是唯一的全局对象,确实不存在你所说的“全局变量”,global语句也只是将名称绑定到模块级命名空间而已。
: 你可以用一个单独模块来存放需要共享的东西:
: [code=python]# vars.py
: ...................
☆─────────────────────────────────────☆
howfar (howfaraway) 于 (Sun Jan 7 00:37:40 2024) 提到:
要是会写类,就不会遇到问题了。
就是个很小很实在的应用,总共也就七八百行
【 在 galaxy123 的大作中提到: 】
: 别用全局变量。都用类封装,走标准写法。
☆─────────────────────────────────────☆
adu (阿杜) 于 (Sun Jan 7 06:13:13 2024) 提到:
别在这瞎说了
贴代码出来
【 在 howfar 的大作中提到: 】
: 程序很简单,
: 一个主程序, 只有数据定义的部分,
: 其他都包装进一个函数a,
: 这个函数也只有一个函数b,也只调用了一次,
: 函数a 一开始就定义了变量var1为全局变量,并赋值为None
: 函数b一开始同样说明了var1为全局变量,
: 但每次调试都报错, var1没有被定义.
: 进入函数b后才报错的.
: 啥问题?
: 全局变量又不是什么复杂概念
:
: --
发自「今日水木 on 鸿蒙」
☆─────────────────────────────────────☆
laserwin355 (laserwin355) 于 (Sun Jan 7 08:04:41 2024) 提到:
全局变量没有坑,唯一的缺点是增加了资源需求而已,自己代码写的不规范不要赖python。另外吧啦吧啦说着白天,不能贴一下源码吗?大家帮你改一下,效率高多了。
发自「快看水母 于 Mate40pro」
☆─────────────────────────────────────☆
Scolesath (Scolesath) 于 (Sun Jan 7 10:50:51 2024) 提到:
import不行啊
【 在 howfar (howfaraway) 的大作中提到: 】
: 发信人: howfar (howfaraway), 信区: Python
: 标 题: Re: 全局变量是坑?
: 发信站: 水木社区 (Fri Jan 5 10:27:21 2024), 转信
:
☆─────────────────────────────────────☆
galaxy123 (galaxy123) 于 (Mon Jan 8 03:00:06 2024) 提到:
你如果不介意,把代码全贴出来,我用gpt4给你优化一下。
【 在 howfar (howfaraway) 的大作中提到: 】
: 发信人: howfar (howfaraway), 信区: Python
: 标 题: Re: 全局变量是坑?
: 发信站: 水木社区 (Sun Jan 7 00:37:40 2024), 转信
:
☆─────────────────────────────────────☆
howfar (howfaraway) 于 (Mon Jan 8 03:45:17 2024) 提到:
谢谢, 没必要, 虽然水平是差, 但是不用您费心了.
您还是忙您自己的吧, 这么闲.
【 在 galaxy123 的大作中提到: 】
: 你如果不介意,把代码全贴出来,我用gpt4给你优化一下。
☆─────────────────────────────────────☆
galaxy123 (galaxy123) 于 (Mon Jan 8 04:10:38 2024) 提到:
gpt4优化800行代码只要一分钟。它能给你改完bug,重构代码架构,还能给你加上大量注释。
【 在 howfar (howfaraway) 的大作中提到: 】
: 发信人: howfar (howfaraway), 信区: Python
: 标 题: Re: 全局变量是坑?
: 发信站: 水木社区 (Mon Jan 8 03:45:17 2024), 转信
:
☆─────────────────────────────────────☆
howfar (howfaraway) 于 (Mon Jan 8 09:10:41 2024) 提到:
编程这事儿对我来说一点儿都不重要, 我重要的事情根本不在编程上.
你的提议倒是可以考虑.
【 在 galaxy123 的大作中提到: 】
: gpt4优化800行代码只要一分钟。它能给你改完bug,重构代码架构,还能给你加上大量注释。
☆─────────────────────────────────────☆
dabada (Da Bada) 于 (Mon Jan 8 09:12:30 2024) 提到:
不用翻墙的国产的有好用的么?
【 在 galaxy123 的大作中提到: 】
: gpt4优化800行代码只要一分钟。它能给你改完bug,重构代码架构,还能给你加上大量注释。
☆─────────────────────────────────────☆
galaxy123 (galaxy123) 于 (Mon Jan 8 10:30:35 2024) 提到:
没有
【 在 dabada (Da Bada) 的大作中提到: 】
: 不用翻墙的国产的有好用的么?
:
:
: 【 在 galaxy123 的大作中提到: 】
FROM 39.183.155.*