在函数中使用变量而不作为参数传递
Use a Variable in a Function Without Passing as an Argument
在 python 中是否有任何方法可以让函数使用变量并 return 它而不将其作为参数传递?
你问的是可能的。如果函数没有重新绑定(例如,分配给)名称,而是使用它,则该名称将被视为 global 名称,例如:
def f():
print(foo)
foo = 23
f()
会按照您的要求去做。然而,这已经是一个可疑的想法了:为什么不只是 def f(foo):
并调用 f(23)
,那么直接和清晰得多?!
如果函数需要绑定名字,那就更可疑了,尽管global
语句允许...:[=16=]
def f():
global foo
print(foo)
foo += 1
foo = 23
f()
print(foo)
在这里,多更好的选择是:
def f(foo):
print(foo)
foo += 1
return foo
foo = f(23)
print(foo)
同样的效果 - 更简洁、更好维护、更好的结构。
为什么 你在寻找劣质(尽管可行)的方法,而更好的方法更容易、更清洁...?!
正如@Alex Martelli 指出的那样,您可以...但是应该吗?这是更相关的问题,IMO。
我理解您所问的吸引力。它似乎应该 只是 好的形式,否则你将不得不在任何地方传递变量,这当然看起来很浪费。
我不敢想知道你的 Python-Fu 有多远(我只能猜测),但是当我还是一个初学者的时候,有几次我也有同样的经历你现在做的问题。使用 global
感觉很丑陋(每个人都说 所以 ),但我有这种不可抗拒的冲动,要按照你的要求去做。最后,我将变量传递给函数。
为什么?
因为这是一种代码味道。你可能看不到它,但在长 运行 中有充分的理由避免它。
不过,你问的是有名字的:
类
你需要的是实例变量。从技术上讲,这可能离您目前的情况只有一步之遥。所以,你可能想知道:为什么这么大惊小怪?毕竟,实例变量被广泛接受,全局变量似乎在本质上是相似的。那么在常规函数中使用全局变量的大问题是什么?
问题主要是概念性的。 类 设计用于对相关行为(函数)和状态(玩家位置变量)进行分组,并具有与之相关的广泛功能(仅使用函数是不可能的)。 类 也是 语义上重要的 ,因为它们在您的脑海中发出明确的意图,并向未来的读者表明程序的方式组织及其运作方式。
除了这样说之外,我不会详细说明:您可能应该重新考虑您的策略,因为它不可避免地导致的道路是这样的:
- 1) 增加代码库中的耦合度
- 2) 无法破译的执行流程
- 3) 调试大富翁
- 4) 意大利面条 代码。
现在看来,这似乎有点夸张。关键是学习如何以有意义的方式组织您的程序,概念上,而不是使用当前需要的方式,您将受益匪浅现在 最少量的代码或对您来说似乎很直观的代码。据我所知,您可能正在开发一个小型应用程序,并且只有一个 1 模块 ,因此它可能类似于使用单个 class。
可能发生的最糟糕的事情是您会采用错误的编码做法。在长运行中,这可能会伤害到你。
在 python 中是否有任何方法可以让函数使用变量并 return 它而不将其作为参数传递?
你问的是可能的。如果函数没有重新绑定(例如,分配给)名称,而是使用它,则该名称将被视为 global 名称,例如:
def f():
print(foo)
foo = 23
f()
会按照您的要求去做。然而,这已经是一个可疑的想法了:为什么不只是 def f(foo):
并调用 f(23)
,那么直接和清晰得多?!
如果函数需要绑定名字,那就更可疑了,尽管global
语句允许...:[=16=]
def f():
global foo
print(foo)
foo += 1
foo = 23
f()
print(foo)
在这里,多更好的选择是:
def f(foo):
print(foo)
foo += 1
return foo
foo = f(23)
print(foo)
同样的效果 - 更简洁、更好维护、更好的结构。
为什么 你在寻找劣质(尽管可行)的方法,而更好的方法更容易、更清洁...?!
正如@Alex Martelli 指出的那样,您可以...但是应该吗?这是更相关的问题,IMO。
我理解您所问的吸引力。它似乎应该 只是 好的形式,否则你将不得不在任何地方传递变量,这当然看起来很浪费。
我不敢想知道你的 Python-Fu 有多远(我只能猜测),但是当我还是一个初学者的时候,有几次我也有同样的经历你现在做的问题。使用 global
感觉很丑陋(每个人都说 所以 ),但我有这种不可抗拒的冲动,要按照你的要求去做。最后,我将变量传递给函数。
为什么?
因为这是一种代码味道。你可能看不到它,但在长 运行 中有充分的理由避免它。
不过,你问的是有名字的:
类
你需要的是实例变量。从技术上讲,这可能离您目前的情况只有一步之遥。所以,你可能想知道:为什么这么大惊小怪?毕竟,实例变量被广泛接受,全局变量似乎在本质上是相似的。那么在常规函数中使用全局变量的大问题是什么?
问题主要是概念性的。 类 设计用于对相关行为(函数)和状态(玩家位置变量)进行分组,并具有与之相关的广泛功能(仅使用函数是不可能的)。 类 也是 语义上重要的 ,因为它们在您的脑海中发出明确的意图,并向未来的读者表明程序的方式组织及其运作方式。
除了这样说之外,我不会详细说明:您可能应该重新考虑您的策略,因为它不可避免地导致的道路是这样的:
- 1) 增加代码库中的耦合度
- 2) 无法破译的执行流程
- 3) 调试大富翁
- 4) 意大利面条 代码。
现在看来,这似乎有点夸张。关键是学习如何以有意义的方式组织您的程序,概念上,而不是使用当前需要的方式,您将受益匪浅现在 最少量的代码或对您来说似乎很直观的代码。据我所知,您可能正在开发一个小型应用程序,并且只有一个 1 模块 ,因此它可能类似于使用单个 class。
可能发生的最糟糕的事情是您会采用错误的编码做法。在长运行中,这可能会伤害到你。