![](/img/trans.png)
[英]Modify global variable in a function and display it in tkinter(edited)
[英]Global variable is not being edited by function
我已经做了相当多的工作,尝试在代码中放置global user
,以查看是否缺少某个地方,但似乎没有。 基本上,当我在此代码块中分配了全局user
变量后调用userInstance.getName()
,如下所示:
if(userName in nameList):
for userdata in pklList:
if userdata.getName() == userName:
global user
user = userdata
print("user data found for user: " + user.getName())
它似乎并没有真正进入全局变量。 这是当前代码的完整版本:
import praw
import time
import re
import pickle
from classes import User
USERAGENT = 'web:CredibilityBot:v0.1 (by /u/ThePeskyWabbit)'
FOOTER = "^^I ^^am ^^a ^^bot! ^^I ^^am ^^currently ^^in ^^test ^^phase. ^^Read ^^about ^^me ^^[here](https://pastebin.com/jb4kBTcS)."
PATH = "C:\\Users\\JoshLaptop\\PycharmProjects\\practice\\commented.txt"
user = User.User("ERROR")
commentFile = open(PATH, 'rb')
commentList = commentFile.read().splitlines()
commentFile.close()
pkl = open("userpkl.pkl", 'rb')
pklList = []
print(pklList)
try:
pickle.load(pkl)
while(True):
pklList.append(pickle.load(pkl))
except EOFError:
pass
pkl.close()
nameList = []
try:
for data in pklList:
nameList.append(str(data.getName()))
except:
pass
print(pklList)
print(nameList)
def addPoint(comment):
message = "current name for user: " + user.getName()
#userInstance.addScore()
#userInstance.addComment(comment)
#message = "Bullshit noted! " + userInstance.getName() + " now has a Bullshit rating of " + userInstance.getScore() + "\n\n" + FOOTER
return message
def getRating():
message = user.getName() + " has a Bullshit rating of: " + user.getScore()
return message
def getCommentList():
bullshitComments = user.getComments()
return bullshitComments
auth = True
def authenticate():
print("Authenticating...")
reddit = praw.Reddit('bot1', user_agent=USERAGENT)
print("Authenticated as {}\n" .format(reddit.user.me()))
return reddit
commentLink = None
actions = {"!bullshit": addPoint(commentLink), "!bullshitrating": getRating(user), "!bullshitdetail":getCommentList(user)}
stringList = ["!bullshit", "!bullshitrating", "!bullshitdetail"]
while(auth):
try:
reddit = authenticate()
auth = False
except:
print("Authentication Failed, retying in 30 seconds.")
time.sleep(30)
def runBot():
SUBREDDITS = 'test'
global user
while(True):
print("Scraping 1000 comments...")
for comment in reddit.subreddit(SUBREDDITS).comments(limit=1000):
for word in stringList:
match = re.findall(word, comment.body.lower())
if match:
id = comment.id
commentFile = open(PATH, 'r')
commentList = commentFile.read().splitlines()
commentFile.close()
if(id not in commentList):
print(match[0] + " found in comment: " + "www.reddit.com" + str(comment.permalink()))
commentLink = "www.reddt.com" + str(comment.parent().permalink())
print("Bullshit comment is: " + commentLink)
print("searching for user data")
userName = str(comment.parent().author)
flag = True
if(userName in nameList):
for userdata in pklList:
if userdata.getName() == userName:
user = userdata
print("user data found for user: " + user.getName())
elif comment.parent().author is not None:
print("no user found, creating user " + userName)
user = User.User(userName)
f = open("userpkl.pkl", 'ab')
pickle.dump(user, f)
f.close()
nameList.append(userName)
print("added to user to pkl file")
else:
print("username could not be retrieved.")
print("adding ID to log\n")
commentFile = open(PATH, 'a')
commentFile.write(id + "\n")
commentFile.close()
flag = False
if(flag):
try:
print(actions[match[0]])
#print("sending reply...")
#comment.reply(actions[match[0]])
#print("Reply successful. Adding comment ID to log\n")
#commentFile = open(PATH, 'a')
#commentFile.write(id + "\n")
#commentFile.close()
except:
print("Comment reply failed!\n")
runBot()
当我在上面提到的代码片段中调用user.getName()
,它输出的是正确的名称,而不是像我在addPoint()
函数中调用它时那样的“错误”,这真是addPoint()
。
打印语句输出如下:
C:\Python36-32\python.exe C:/Users/JoshLaptop/PycharmProjects/practice/TestBot.py
[]
[<classes.User.User object at 0x03B59830>, <classes.User.User object at 0x03816430>]
['PyschoWolf', 'ThePeskyWabbit']
Authenticating...
Authenticated as CredibilityBot
Scraping 1000 comments...
!bullshit found in comment: link deleted for privacy
Bullshit comment is: link deleted for privacy
searching for user data
user data found for user: PyschoWolf
current name for user: ERROR
!bullshit found in comment: link deleted for privacy
Bullshit comment is: link deleted for privacy
searching for user data
user data found for user: ThePeskyWabbit
current name for user: ERROR
在python中,如果您的代码对变量进行了赋值,则除非明确说明,否则该变量被假定为局部变量。 如果明确声明它们,则它们是全局的。
但是全局变量是“每个模块”。
经常不清楚的是,当您导入名称时,会发生的事情是在当前模块中将导入值的副本复制为具有相同名称的全局模块(如果也使用as
则使用不同的名称。例如:
from xxx import user
# xxx.user has been copied to a globl named user
user = "baz" # <--- this DOES NOT change xxx.user
xxx.user = "ohyeah" # Now it changes xxx.user
请注意,Python中对此有一些“魔术”,并且函数会记住它们在哪个模块中定义。 假设我有:
# module.py
user = "No user yet"
def setUser(newUser):
global user
user = newUser
def getUser():
return user
# program.py
from module import user, setUser, getUser
print(user) # --> "No user yet"
print(getUser()) # --> "No user yet"
setUser("Hey")
print(user) # --> "No user yet" (1)
print(getUser()) # --> "Hey"
user = "Foo"
print(user) # --> "Foo"
print(getUser()) # --> "Hey" (2)
(1)之所以发生,是因为user
只是程序的全局变量,而不是模块的全局变量。 该值在导入时已从模块复制到程序中,仅此而已
(2)发生的原因相同。 在模块中编译的代码将被视为该模块的全局变量,而不是程序的全局变量。 尽管在程序中进行了调用,但仍发生了这种情况,并且getUser
变量(包含函数)在此处。 “记住”的功能是它应访问的全局变量。
编码
from xxx import yyy
是相同的
import xxx
yyy = xxx.yyy # simple assignment to a global
相对于完整程序,Python没有真正的“全局变量”。 x = 3
类的语句将始终修改局部变量,捕获的变量( nonlocal
声明)或全局模块。 根本就没有“真正的全局”(如果您真正需要它们,您可以做的是为全局变量创建一个特定的模块,并使用myglobs.var
而不是var
myglobs.var
它们)。
PS:代码
def addPoint(userInstance, comment):
global user
userInstance = user
message = "current name for user: " + userInstance.getName()
看起来很奇怪。 参数userInstance
被覆盖。 可能是你的意思
user = userInstance
代替?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.