我想知道为什么这个简单的代码不起作用.
在main.py我有
def foo():
HTTPHelper.setHost("foo")
host = HTTPHelper.host()
Run Code Online (Sandbox Code Playgroud)
并在HTTPHelper.py中:
_host = None
def setHost(host):
_host = host
def host():
return _host
Run Code Online (Sandbox Code Playgroud)
但是当我逐步执行foo()时,主机变为NoneType,即使我之前将它设置在行上.非常困惑...
我已经阅读了其他一些SO(PythonScope和全局变量不需要全局),但似乎没有任何内容可以像我想的那样明确解释,而且我在精神上筛选PyDocs是否告诉我问题的答案时遇到了麻烦:
myList = [1]
def foo():
myList = myList + [2, 3]
def bar():
myList.extend([2, 3])
def baz():
myList += [2, 3]
Run Code Online (Sandbox Code Playgroud)
现在,可以理解,
>>> foo()
UnboundLocalError
Run Code Online (Sandbox Code Playgroud)
和
bar() # works
myList # shows [1, 2, 3]
Run Code Online (Sandbox Code Playgroud)
但是之后
>>> baz()
UnboundLocalError
Run Code Online (Sandbox Code Playgroud)
然而,我认为,+=在这种情况下extend(),隐含地称为方法运算符的东西,但错误意味着由于某种原因它实际上不会被+=视为extends().这与Python解析应该如何工作一致吗?
我本以为调用与方法运算符等效的函数,它们在所有情况下都是等价的.相反,它似乎将其视为+=实际的赋值运算符.除此之外,这并不完全正确,因为如果我做了某些事情(诚然做作):
myList = range(50000000) # wait a second or two on my laptop before returning
myList += [0] # returns instantly
myList = …Run Code Online (Sandbox Code Playgroud) 所以基本上我不知道这小块代码有什么问题,而且似乎找不到让它工作的方法.
points = 0
def test():
addpoint = raw_input ("type ""add"" to add a point")
if addpoint == "add":
points = points + 1
else:
print "asd"
return;
test()
Run Code Online (Sandbox Code Playgroud)
我得到的错误是:
UnboundLocalError: local variable 'points' referenced before assignment
Run Code Online (Sandbox Code Playgroud)
注意:我不能在函数中放置"points = 0",因为我会重复多次,所以它总是先将点设置回0.我完全陷入困境,任何帮助将不胜感激!
已经为此苦苦挣扎了一段时间。
基于此线程:在函数中使用全局变量而不是创建它们的函数
我应该能够通过在特定时间安排任务来更新 thread_2 使用的变量。
编码:
import asyncio
from concurrent.futures import ProcessPoolExecutor
from apscheduler.schedulers.asyncio import AsyncIOScheduler
from datetime import datetime
import time
def day_limits():
global variable
variable = 90
print ('Day Variable: ',variable)
def night_limits():
global variable
variable = 65
print ('Night Variable: ',variable)
def thread_2():
while True:
c_hour = int(datetime.now().strftime("%H"))
c_min = int(datetime.now().strftime("%M"))
c_sec = int(datetime.now().strftime("%S"))
print ('%02d:%02d:%02d - Variable: %d ' % (c_hour,c_min,c_sec,variable))
time.sleep(2)
if __name__ == "__main__":
variable = 60
scheduler = AsyncIOScheduler()
scheduler.add_job(day_limits, 'cron', hour=7,misfire_grace_time=3600,timezone='GB') …Run Code Online (Sandbox Code Playgroud) 我有一个用 Python 3.5 编写的程序的一部分,并从测试前两个模块开始。我设法隔离其中一个模块中的一个问题,其中两个全局变量似乎无缘无故地切换回其原始值。这些全局变量之一 ( event_count) 仅在单个函数中使用(grep 显示字符串“event_count”没有出现在我的任何 *.py 文件中的其他任何位置),但变量的值在函数调用之间发生变化。如果我为此模块中的其他全局变量添加打印语句,它也会同时恢复为原始值。移动event_count到另一个模块(用sensorlogic.event_countin替换它eventcount()并将初始化移动到另一个模块)会使该行为消失,所以我有一个修复但不理解。
event_count以下是模块中使用 , 的所有代码sensoreval:
event_count = 0
def eventcount(increment):
global event_count
print("entering eventcount, increment =", increment,
", event_count =", event_count)
event_count += increment
print("leaving eventcount, event_count =", event_count)
return event_count
Run Code Online (Sandbox Code Playgroud)
如果我运行以下代码段:
e.setvalue(1)
print("I am at marker #1")
eventcount(0)
Run Code Online (Sandbox Code Playgroud)
( 中的最后一个操作e.setvalue()是调用eventcount(0))它会产生以下输出:
entering eventcount, increment = 0 , event_count = 4
leaving eventcount, event_count = 4
I am at …Run Code Online (Sandbox Code Playgroud) 我正在使用 python Falcon 开发后端 api 服务。为了服务每个 api 调用,我需要使用一个对象(所有请求都使用相同的对象),该对象每 X 小时(假设 1 小时)刷新一次。目前该对象在 S3 中保存为 pickle。问题是,pickle 相当大(~20 MB),因此为每个 api 调用读取 pickle 似乎效率不高。然而,我不确定在不同的 api 调用之间将该对象保留在内存中的正确方法是什么,以及如何每 X 小时刷新一次。因为pickle相对较大,所以我不想将其存储在本地,而更喜欢内存中共享对象的方法。
谢谢,奥伦
OpenCV imshow 函数似乎在函数外部工作,但不在该函数内部工作(我不认为答案是 waitKey())。为什么会发生这种情况以及如何解决?
我正在学习 2D Gabor 小波。为了进行实验和观察,我首先创建了一个内核可视化工具。这是一段漂亮、愉快的 JavaScript 代码,它向我展示了我正在创建的内核。如果您看一下,我将非常感激:http ://alpersunter.github.io/Gabor2D/
这显然没有告诉我应用内核后生成的图像是什么样子。因此,我安装了 OpenCV (4.1.0) 并在 python 上编写了一个程序(3.6.7 安装在 Ubuntu 18.04 上),据说该程序应该以与我的内核可视化工具类似但更令人印象深刻的方式运行。它不仅要实时计算内核,还要对原始图像及其灰度对应物应用滤波器,最后将它们显示出来。
我使用 cv2.createTrackbar() 创建滑块,在任何参数更改后,轨迹栏都会调用“myValueChanged(newVal)”函数。该函数然后使用更新的参数计算新的内核,最后重新绘制新图像(这是函数 cv2.filter2D(src, -1, kernel) 的返回值)。
现在,如果我在 valueChanged() 函数内调用 imshow() ,一切都会正常。但是,如果我将内核计算、内核应用程序和 cv2.imshow(result) 封装在另一个我称为“redraw()”的函数中,则 imshow 不想工作。
这是我的代码示例:
import cv2
import numpy as np
messi_0_window = "Messi0" # original image
cv2.namedWindow(messi_0_window, cv2.WINDOW_NORMAL)
messi_grey_window = "Messigray" # grayscale of origial
cv2.namedWindow(messi_grey_window, cv2.WINDOW_NORMAL)
messi_1_window = "Messi1" # this will be the result of kernel convolution of rgb messi
cv2.namedWindow(messi_1_window, cv2.WINDOW_NORMAL)
messi_2_window …Run Code Online (Sandbox Code Playgroud) 我试图在程序中进一步更改变量.我在程序开始时声明了一个全局变量,我想在程序中更改不同函数中的变量.我可以通过再次声明函数内部的变量来做到这一点,但我想知道是否有更好的方法来做到这一点.下面是一些测试代码来解释我的意思.
ID = 'No'
project = ("Yep"+ID) # ID added with 'No' value which I later want to change
def pro():
ID = "YES"
print ID
def pro1(ID):
# I could declare project again to get this to work, but I would like to avoid this
print project # I want this to print with the new ID number.
if __name__ == '__main__':
pro()
pro1(ID)
Run Code Online (Sandbox Code Playgroud)
有任何想法,谢谢
我已经尝试了global变量,但是当我这样做时,项目变量仍然打印出YepNo而不是YepYES.我希望函数中的新变量pro改变变量中的project变量.
我是一个python /编程新手,也许我的问题根本就没有意义.
我的问题是,如果变量是动态的,我无法将变量变为全局变量,我的意思是我可以这样做:
def creatingShotInstance():
import movieClass
BrokenCristals = movieClass.shot()
global BrokenCristals #here I declare BrokenCristals like a global variable and it works, I have access to this variable (that is a shot class instance) from any part of my script.
BrokenCristals.set_name('BrokenCristals')
BrokenCristals.set_description('Both characters goes through a big glass\nand break it')
BrokenCristals.set_length(500)
Fight._shots.append(BrokenCristals)
def accesingShotInstance():
import movieClass
return BrokenCristals.get_name()#it returns me 'BrokenCristals'
Run Code Online (Sandbox Code Playgroud)
但如果不这样做,我声明一个像这样的字符串变量:
def creatingShotInstance():
import movieClass
a = 'BrokenCristals'
vars()[a] = movieClass.shot()
global a #this line is the only …Run Code Online (Sandbox Code Playgroud) 我刚刚开始学习Python,我遇到了这个问题.我想从方法内部设置变量,但变量在方法之外.
该方法由按钮激活.然后我想从我按下另一个按钮时设置的变量中获取值.问题是我从方法内部放入变量的值不会保留.我该如何解决这个问题?
代码在下面.currentMovie是我试图改变的变量.当我用方法按下按钮时UpdateText(),它打印出一个像它应该的随机数.但是当我按下激活的按钮时,UpdateWatched()它打印出来0.所以我假设变量永远不会被设置.
import random
from tkinter import *
currentMovie = 0
def UpdateText():
currentMovie = random.randint(0, 100)
print(currentMovie)
def UpdateWatched():
print(currentMovie)
root = Tk()
root.title("MovieSelector9000")
root.geometry("900x600")
app = Frame(root)
app.grid()
canvas = Canvas(app, width = 300, height = 75)
canvas.pack(side = "left")
button1 = Button(canvas, text = "SetRandomMovie", command = UpdateText)
button2 = Button(canvas, text = "GetRandomMovie", command = UpdateWatched)
button1.pack(anchor = NW, side = "left")
button2.pack(anchor = NW, side = "left")
root.mainloop()
Run Code Online (Sandbox Code Playgroud) python ×10
function ×2
global ×2
api ×1
apscheduler ×1
imshow ×1
methods ×1
opencv ×1
pickle ×1
python-2.7 ×1
python-3.x ×1