python - 如果我将用户提供的值作为函数参数,如何使其成为全局变量?
问题描述
我正在编写一个程序,可以将给定的序列(列表 l)洗牌 m 次。我的函数将列表 l 和数字 m 作为输入,但我已经为一个 shuffle 定义了 shuffle 本身,然后使用 for 循环执行 m 次。但是,现在 for 循环不采用用户分配的 m 值。
我是一个 Python 菜鸟,所以我很可能错过了一件简单的事情。我尝试使用全局 m,在我的函数中(重新)定义 m,但要么我不知道该怎么做,要么它似乎不起作用。
def riffle_shuffle(l, global m):
#global m goes here?
r = np.random.binomial(len(l),0.5)
sd1 = l[:r]
d2 = l[r:]
fl = []
c = [sd2,sd1]
l2 = sd2+sd1
for i in range(1,len(l) + 1):
x = [sd2,sd1]
y = [(len(sd2))/(len(l) - i+1),(len(sd1))/(len(l) - i+1)]
a = choices(x,y)
a1 = a[0][0]
fl.append(a1)
#Deck Split is c
#Sub decks are',c
#Probabilities are',y
#Deck chosen is',a
#fl
if a1 in sd1:
sd1.remove(a1)
elif a1 in sd2:
sd2.remove(a1)
return fl,m
for j in range(1,m+1):
fl = riffle_shuffle(fl)
return fl
我收到错误说 m 未定义,语法无效,以下错误消息。我不知道最后一个是什么意思。
'比较超过最大递归深度'
非常感谢任何帮助,谢谢!
编辑:我错过了我在描述中提到的 for 循环。现在好了对不起。
解决方案
所以......你想要的方法可以做 riffle shuffle m 次,对吧?
您的代码存在一些问题:
首先,return
是在功能之外。
其次,你在你的函数中调用你的函数,没有破坏条件:所以函数将调用函数,并且会一次又一次地调用函数,依此类推,直到发生错误。那就是maximum recursion depth exceeded in comparison
。
第三,你有这样的使用np.random.choice
:np.random.choice(x, p=y)
。否则,python 不知道 y 是概率,它会将其解释为第二个参数:输出的大小。所以这里发生错误。
这可能是您要编写的代码:
import numpy as np
def riffle_shuffle(l, m):
if m == 0:
return l
else:
fl = []
r = np.random.binomial(len(l), 0.5)
sd1 = l[:r]
sd2 = l[r:]
c = [sd2,sd1]
l2 = sd2+sd1
for i in range(1,len(l) + 1):
x = [sd2,sd1]
y = [(len(sd2))/(len(l) - i+1), (len(sd1))/(len(l) - i+1)]
a = np.random.choice(2, p=y)
a = x[a]
a1 = a[0]
fl.append(a1)
#Deck Split is c
#Sub decks are',c
#Probabilities are',y
#Deck chosen is',a
#fl
if a1 in sd1:
sd1.remove(a1)
elif a1 in sd2:
sd2.remove(a1)
fl = riffle_shuffle(fl, m - 1)
return fl
a = riffle_shuffle([1, 2, 3, 4, 5, 6, 7, 8], 3)
print(a)
#output : [5, 6, 1, 7, 4, 8, 2, 3] (can be changed)
正如您所做的那样,我将函数称为“递归” - 在函数中调用函数 - 带有中断条件。
这样,您就不必使用全局变量——在大多数情况下,使用全局变量并不是一个好主意。
而且,关于您的问题(如何将用户提供的值设为全局变量),您可以这样做。
a = 0
def foo(m):
global a
a = m
#and your code here...
推荐阅读
- java - android.view.InflateException: Binary XML file line #38: Binary XML file line #38: Error inflating class fragment
- python - 如何在 python pptx 中更改 TickLabelSpacing
- c# - 类型预期标识符预期
- c# - Xamarin 数据绑定未更新
- tsql - 将 DATE 转换为 UTCTicks 用于 sql 查询日期输入
- gdb - 如何在 stm32cubeide 中启动 GDB 服务器?
- reactjs - 我如何在我的项目中使用“withChangesForTables”,最好的方式是什么?
- web-audio-api - 尝试创建多个振荡器
- jquery - 为什么在我的 WebGrid 上看到重复的排序按钮?
- node.js - 在nodejs中合并音频和视频而不使用ffmpeg