我以为我会'全球'但...... [英] I thought I'd 'got' globals but...
问题描述
我以为我已经''得到'全局,但这个看起来很奇怪。
我希望我的示例函数''doIt''可以使用并可选择修改模块
变量''gname'',所以我在函数中声明''global gname'',但当
被修改时它不会被修改。
gname =''苏''
def doIt(name = gname):
global gname
gname = name
print''doIt name'',name,''gname'',gname
print''start gname'',gname
doIt()
doIt(name =''Lisa'')
doIt()
打印''完成gname'',gname
给...
start gname Sue
doIt name Sue gname Sue
doIt name Lisa gname Lisa
doIt name Sue gname Sue
完成gname Sue
变量gname已恢复为值''苏''
奇怪的是,无线在第三次doIt()调用中,它有效...
print''start gname'',gname
doIt()
doIt (name =''Lisa'')
#doIt()
打印''完成gname'',gname
给...
start gname Sue
doIt name Sue gname Sue
doIt name Lisa gname Lisa
完成gname Lisa
变量gname已被修改为''Lisa''
任何想法如何制作''Lisa''永远在第二次永久分配
doIt?谢谢
(注意:Contrived示例替代了Web类型的应用程序,如果在没有参数的情况下调用
页面,则显示全局默认值。
如果使用表单参数调用页面,那么它应该能够
更改全局默认值)
meridian写道:
我以为我已经''得到''全局,但这个看起来很奇怪。
我希望我的示例函数''doIt''使用并可选地修改模块
变量''gname'',所以我在函数中声明''global gname'',但是当
修改它不会保持修改。
gname =''苏''
def doIt(name = gname ):
这是一个FAQ,cf:
htt p://www.python.org/doc/faq/genera...etween-objects
简要说明:默认args只在加载时被评估一次/导入时间。
任何想法如何让'Lisa'作业永远永久永久地在第二个
doIt ?谢谢
def doIt(name = None):
global gname
如果名称为None:
name = gname
else:
gname = name
(注意.Contrived示例替换为web类型的应用程序,如果在没有参数的情况下调用
页面,则显示全局默认值。
如果使用表单参数调用页面,则它应该能够
更改全局默认值)
从函数中修改全局变量通常是一个非常糟糕的主意。
-
bruno desthuilliers
python -c" print''@''。join([''。''。join([w p.split(''。'')中的w的[:: - 1]])''o **** @ xiludom.gro'中的
p。分裂(''@ '')])"
Bruno Desthuilliers写道:
def doIt(name = None):
全球gna我是
如果名字是无:
name = gname
else:
gname = name
谢谢Bruno,工作待遇...
meridian写道:
Bruno Desthuilliers写道:
>> def doIt(name = None):
global gname
如果名称为无:
name = gname
否则:
gname = name
感谢Bruno,作品一种享受...
但仍然很可能是一个坏主意。
-
bruno desthuilliers
python -c" print''@''。join([''。''。join([w [:: - 1] for p in p.split(' '。'')])''o **** @ xiludom.gro'中的
p。分裂(''@'')])"
I thought I had ''got'' globals but this one seems strange.
I want my example function ''doIt'' to use and optionally modify a module
variable ''gname'', so I declare ''global gname'' in the function, but when
modified it doesn''t stay modified.
gname = ''Sue''
def doIt(name = gname):
global gname
gname = name
print ''doIt name'', name, ''gname'', gname
print ''start gname'', gname
doIt()
doIt(name=''Lisa'')
doIt()
print ''finish gname'', gname
gives...
start gname Sue
doIt name Sue gname Sue
doIt name Lisa gname Lisa
doIt name Sue gname Sue
finish gname Sue
The variable gname has reverted back to value ''Sue''
Curiously though, without the third doIt() call, it works...
print ''start gname'', gname
doIt()
doIt(name=''Lisa'')
#doIt()
print ''finish gname'', gname
gives...
start gname Sue
doIt name Sue gname Sue
doIt name Lisa gname Lisa
finish gname Lisa
The variable gname has been modified to ''Lisa''
Any ideas how I can make the ''Lisa'' assignment permanent forever in 2nd
doIt? Thanks
(Note. Contrived example substitutes for a web-type app, where, if the
page is called without arguments then it displays the global defaults.
If the page is called with form arguments then it should be able to
change the global defaults)
meridian wrote:I thought I had ''got'' globals but this one seems strange.
I want my example function ''doIt'' to use and optionally modify a module
variable ''gname'', so I declare ''global gname'' in the function, but when
modified it doesn''t stay modified.
gname = ''Sue''
def doIt(name = gname):This is a FAQ, cf:
http://www.python.org/doc/faq/genera...etween-objects
Briefly : default args are eval''d only once at load/import time.
Any ideas how I can make the ''Lisa'' assignment permanent forever in 2nd
doIt? Thanksdef doIt(name=None):
global gname
if name is None:
name = gname
else:
gname = name
(Note. Contrived example substitutes for a web-type app, where, if the
page is called without arguments then it displays the global defaults.
If the page is called with form arguments then it should be able to
change the global defaults)Modifying globals from within a function is usually a very bad idea.
--
bruno desthuilliers
python -c "print ''@''.join([''.''.join([w[::-1] for w in p.split(''.'')]) for
p in ''o****@xiludom.gro''.split(''@'')])"
Bruno Desthuilliers wrote:def doIt(name=None):
global gname
if name is None:
name = gname
else:
gname = name
Thanks Bruno, works a treat...
meridian wrote:Bruno Desthuilliers wrote:
>>def doIt(name=None):
global gname
if name is None:
name = gname
else:
gname = name
Thanks Bruno, works a treat...
But still very probably a bad idea.
--
bruno desthuilliers
python -c "print ''@''.join([''.''.join([w[::-1] for w in p.split(''.'')]) for
p in ''o****@xiludom.gro''.split(''@'')])"
这篇关于我以为我会'全球'但......的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!